rails 2.3.5和rails 2.3.8之间的accepts_nested_attributes_for不兼容

时间:2011-03-23 17:05:43

标签: ruby-on-rails

我刚发现rails 2.3.5和rails 2.3.8之间的行为发生了变化,我找不到任何谷歌搜索。

我需要模特

class Book < ActiveRecord::Base
  has_many :authors
  accepts_nested_attributes_for authors
end

class Author < ActiveRecord::Base
  belongs_to :book
end

我希望用作者嵌套视图来填充一本书。

进入书籍控制器我有更新动作

def update
  @book = Book.find(params[:id])
  @book.attributes = params[:book]
  ....
end

params[:book]看起来像这样:

{:name=>"a great book", "authors_attributes"=>{"1"=>{:id"=>"2", "_destroy"=>"", :name => "Boney M"}}}

在我的过程中,我想访问我更新的集合(在保存书籍对象之前,例如用于验证),使用rails 2.3.5 @ book.authors给了我作者集合更新的值为params [ :书]哈希。但是在2.3.8中,它给了我从数据库重新加载的作者集合。

我的问题来自函数assign_nested_attributes_for_collection_association(/usr/lib/ruby/gems/1.8/gems/activerecord-2.3.8/lib/active_record/nested_attributes.rb)。它返回一个带有@loaded = false的AssociationProxy对象。因此,当我第一次使用@ book.authors访问我的集合时,它会从db重新加载它。 rails 2.3.5不是这种情况。

我在这里遗漏了什么或者某个新行为已被报道过吗?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

不确定这是否相关,但我注意到当我将应用程序从2.3.5更新到2.3.8时,我无法再更新相关记录。系统忽略已有记录的更新信息,并仅添加新记录。我发现,如果我想更新相关记录,我必须将其从数据库中删除,然后再次创建它。完全糟透了。

class Product < ActiveRecord::Base
    has_many :allowed_design_types, :dependent => :destroy, :include => [:design_type], :order => 'design_types.name'
    has_many :design_types, :through => :allowed_design_types
    accepts_nested_attributes_for(
      :allowed_design_types, 
      :allow_destroy => true, 
      :reject_if => proc { |obj| p obj; !['1', 'true'].include?(obj.delete('allow')) }
    )
end

这会在参数中发送但完全被忽略:

"product"=>{"allowed_design_types_attributes"=>{"0"=>{"design_type_id"=>"5", "allow"=>"1", "product_id"=>"1", "id"=>"45", "your_price"=>"3", "_destroy"=>""}}