2011-01-08 67 views
2

我一直在調試這一整天。 我在我的應用程序中有兩個模型:teaClass &茶。在teaclass.rb中,我有如何正確使用belongs_to和has_many?

has_many :teas 

在tea.rb中,我有'belongs_to:teaclass`。

我儘量使URL看起來像這樣"..teaclasses/:id/teas/:id";所以在teas_controller.rb,我把before_filter :get_teaClass

def show 
@tea = @teaclass.teas.find(params[:id]) 

respond_to do |format| 
    format.html # show.html.erb 
    format.xml { render :xml => @tea } 
end 
end 

def new 
if @teaclass.teas 
    @tea = @teaclass.teas.new 
    @teaclass.teas << @tea 
    #@tea = Tea.new 
    else 
     flash[:notice=>"failed"] 
     @tea = Tea.new 
     @teaclass.teas << @tea 
    end 
respond_to do |format| 
    format.html # new.html.erb 
    format.xml { render :xml => @tea } 
end 
end 

def get_teaClass 
    begin 
     @teaclass = Teaclass.find(params[:teaclass_id])rescue 
     redirect_to teaclass_path, :notice => "Teaclass Required!" 
    end 
end 

但我不斷收到一個錯誤說 「未知屬性:teaclass_id」

/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2906:inassign_attributes' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `each' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2902:in `assign_attributes' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2474:in `initialize' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `new' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `send' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:380:in `method_missing' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/base.rb:2178:in `with_scope' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in `send' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_proxy.rb:207:in `with_scope' 
/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/associations/association_collection.rb:376:in `method_missing' 
/home/jianpchen/repo/Teashop/app/controllers/teas_controller.rb:31:in `new' 

任何人都可以幫我解決這個問題?謝謝。

+0

確保你所有的代碼都是正確的,我編輯了它的出來 – s84 2011-01-08 03:40:09

+0

謝謝編輯:D – jchenjc 2011-01-08 03:53:01

回答

3

我儘量使URL看起來像這樣」 ..teaclasses /:ID /茶/:ID 「;所以在teas_controller.rb,我把的before_filter:get_teaClass

這隻影響,如果你想獲得嵌套的路線設置,但ID聽起來並不像你正在做的。

你需要做的是實際添加外部id到數據庫。因此請檢查schema.rb並確保該列存在。

這是你需要做的。

  1. 請確保您在數據庫表tea中確實有外國人。
  2. 如果您跳過下一步,我將向您展示更好的編寫代碼的方法。
  3. 如果您的'tea'表中沒有'tea_class_id'作爲整數值,則需要添加它。
  4. 腳本/生成遷移add_tea_class_id_to_tea
  5. 耙分貝:遷移
  6. 現在這是你的代碼應該怎麼寫

的routes.rb

map.resources :teas 
map.resources :teas_classes 

模型

型號/ tea.rb

class Tea < ActiveRecord::Base 
    belongs_to :tea_class 
end 

tea_class.rb

class TeaClass < ActiveRecord::Base 
    has_many :teas 
end 

控制器

teas_controller。RB

def new 
    @tea = Tea.new 
end 

def show 
    @tea = tea.find(params[:id) 
end 

def create 
    @tea = Tea.new(params[:tea]) 
    if @tea.save 
     redirect_to teas_path 
    else 
     render :action => 'new' 
    end 
end 

意見

這是非常重要的。請確保您傳遞:tea_class_id作爲一個參數,當你創建一個茶否則它不知道如何進行關聯。它有點舞臺後面,因爲你送params[:tea],但它是在該tea_class_id實際發送這些參數。

所以......在你看來,你需要有某種方式供用戶選擇一個類別或您有它的茶類和通常與一個選擇框完成時,它是一個一對多的關聯。

new.html.erb

<% form_for(@tea) do |t| %> 
    <%= t.collection_select :tea_class_id TeaClass.all, :id, :name %> 
<% end %> 

請確保您有茶課實際上填補了collection_select方法。谷歌,加上軌道API,如果你不知道發生了什麼事情。

嵌套路由(側面)

看着像你試圖讓像teaclasses/:id/teas/:id的路由。這就是所謂的嵌套路由,你將要設置在你的routes.rb

map.resources :tea_classes_ do |tea_classes| 
    tea_classes :teas 
end 
map.resources :teas 

然後你就可以鏈接到teas_classes/pour/teas/chinese。你應該知道這個命令rake routes。它會幫助你理解路徑的工作方式。

但如果你只是想鏈接起來啦,應該是這樣的:

<%= link_to "Teas", tea_classes_teas_path(@tea_class)%> 

您需要提供@teas做鏈接,因爲它需要從該ID,當你點擊它,它給予teas_controller' as params [:teas_class_id]`。你不需要做任何事情。它會自動在URL中。

0

如果你看看你的日誌,你會看到params包含的內容。鑑於你的代碼和解釋,沒有關鍵參數teaclass_id。你很可能在尋找:id。如果您要訪問:teaclass_id,你可能需要設置在你的路線

match 'controller/:teaclass_id' => 'controller#show' 
相關問題