我刚发现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不是这种情况。
我在这里遗漏了什么或者某个新行为已被报道过吗?
提前感谢您的帮助。
答案 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"=>""}}