我已經升級到Rails 2.3.3(從2.1.x開始),我試圖找出accepts_nested_attributes_for
方法。我可以使用該方法更新現有的嵌套對象,但我不能用它來創建新的嵌套對象。由於人爲的例子:如何使用accept_nested_attributes_for創建嵌套對象
class Product < ActiveRecord::Base
has_many :notes
accepts_nested_attributes_for :notes
end
class Note < ActiveRecord::Base
belongs_to :product
validates_presence_of :product_id, :body
end
如果我試圖創建一個新的Product
,與嵌套Note
,如下:
params = {:name => 'Test', :notes_attributes => {'0' => {'body' => 'Body'}}}
p = Product.new(params)
p.save!
它失敗的消息驗證:
ActiveRecord::RecordInvalid: Validation failed: Notes product can't be blank
我明白爲什麼會發生這種情況 - 這是因爲Note
課程上的validates_presence_of :product_id
,因爲在保存新記錄時,Product
對象沒有id
。但是,我不想刪除此驗證;我認爲刪除它是不正確的。
我也可以通過先手動創建Product
,然後添加Note
來解決問題,但是這樣做會使accepts_nested_attributes_for
的簡單性失效。
是否有標準的Rails方式在新記錄上創建嵌套對象?
在Rails 3這個問題通過加入解決。見例如http://www.daokaous.com/rails3.0.0_doc/classes/ActiveRecord/Associations/ClassMethods.html#M001988「雙向關聯」部分下 – 2010-06-09 12:47:10
我選擇禁用驗證時:id == nil 。因爲只有在編寫新的嵌套記錄時纔會發生這種情況,所以我希望這會很安全。奇怪的是,這個問題一直到2.3.8。 – aceofspades 2010-09-27 16:48:13