我正在尝试执行嵌套模型的update_attributes并继续遇到批量分配错误。这是我的模特:
class Lineup < ActiveRecord::Base
belongs_to :user
has_many :piece_lineups
has_many :pieces, through: :piece_lineups
accepts_nested_attributes_for :piece_lineups
end
class Piece < ActiveRecord::Base
attr_accessible :cost, :description, :name, :category
has_many :piece_lineups
has_many :lineups, through: :piece_lineups
end
class PieceLineup < ActiveRecord::Base
attr_accessible :piece
belongs_to :piece
belongs_to :lineup
end
顺便提一下用户has_one阵容。所以我认为通过将accepts_nested_attributes_for添加到它可以工作的阵容模型,但事实并非如此。这是我的表格:
- @lineup.piece_lineups.build(:piece => piece)
= form_for(@lineup) do |f|
= f.fields_for :piece_lineups do |piece_lineup|
= piece_lineup.hidden_field(:piece_id, :value => piece.id)
= f.submit
和我的阵容控制器操作:
def update
@lineup = current_user.lineup
@lineup.update_attributes(params[:lineup])
最后,错误:
无法批量分配受保护的属性:piece_lineups_attributes
我在这里缺少什么?谢谢!
答案 0 :(得分:3)
accepts_nested_attributes_for
创建一个属性编写器 - 在您的情况下为piece_lineups_attributes=
- 用于将属性传递给另一个模型。因此,您需要将attr_accessible :piece_lineups_attributes
添加到您的阵容模型中,以使其可以进行批量分配。
<强>更新强>
有一种更好的方法可以解决这个问题。
如果您将attr_accessible :piece_ids
添加到阵容模型中,请将视图更改为
= form_for(@lineup) do |f|
= f.hidden_field(:piece_ids, :value => piece.id)
= f.submit
您根本不需要嵌套属性。
答案 1 :(得分:-1)
批量分配通常意味着将属性传递给调用,该调用将对象创建为属性哈希的一部分。因此,请将piece_lineup
的字段添加到该模型的attr_accessors
列表中,或者尝试以下操作:
@lineup = current_user.lineup
@lineup.piece_id = params[:piece_id]
@lineup.save
另见:
http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html