我已经升级到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