2010-06-21 110 views
3

在我的應用程序有2類是這樣的:傳遞關聯參數

class City < ActiveRecord::Base 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :city 
    attr_accessible :title, :city_id 
end 

如果我創建城市目標:

city = City.create!(:name => 'My city') 

,然後傳遞參數給這樣創建事件:

event = Event.create!(:name => 'Some event', :city => city) 

我得到

event.city_id => null 

所以問題是 - 是否有可能傳遞參數以這種方式讓我的對象連接,我做錯了什麼?或者我應該使用其他方式(如

event.city = city 

) ?

+0

我剛剛創建的城市,事件模型一樣的你,用你的代碼從上面的事件成功創建並與城市相關聯。你使用的是什麼版本的Rails?你使用'script/console'來測試它嗎? – mikej 2010-06-21 11:45:17

+0

是的,我測試腳本/控制檯,rails版本是2.3.5 – lightalloy 2010-06-21 11:51:04

+0

我在這裏使用的相同版本。模型中是否有其他代碼? – mikej 2010-06-21 11:55:40

回答

4

一般情況下,當你有一個attr_accessor排除或包含Event:city屬性的attr_protected。允許:city_id可訪問不允許自動允許:city如此。

(注:這個回答在上述評論提供按照討論,因此社區的wiki)。

0

你應該做

event = Event.create!(:name => 'Some event', :city_id => city.id) 
+1

我知道,我可以這樣做。我問是否可以像我所描述的那樣傳遞參數。 – lightalloy 2010-06-21 11:34:04

+0

好吧,你的模型不會保存 - 可能驗證失敗,城市是空白的 - 你想要更多的證據,它不能工作? :) – 2010-06-21 11:46:03

+0

對不起,我在我的問題中犯了一個錯誤:( 我的意思是「event.city_id」,而不是「event.id」。對象被保存,但他們沒有連接 – lightalloy 2010-06-21 11:48:27

1

這將工作:

city = City.create!(:name => "London") 

event = Event.create!(:name => "Big Event") 
event.city = city 
event.save 

另外,如果Event.validates_presence_of :city,從而Event.create!通話將沒有City失敗,你可以這樣做:

event = Event.new(:name => 'Big Event').tap do |e| 
    e.city = city 
    e.save! 
end