Ruby on rails 如何避免大量分配错误与多:通过关系

Ruby on rails 如何避免大量分配错误与多:通过关系,ruby-on-rails,activerecord,nested-attributes,mass-assignment,Ruby On Rails,Activerecord,Nested Attributes,Mass Assignment,我正在尝试更新嵌套模型的属性,并不断遇到质量分配错误。以下是我的模型: 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::Ba

我正在尝试更新嵌套模型的属性,并不断遇到质量分配错误。以下是我的模型:

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
和我的阵容控制器操作:

  def update
    @lineup = current_user.lineup
    @lineup.update_attributes(params[:lineup])
最后是错误:

无法批量分配受保护的属性:工件\u排列\u属性


我错过了什么?谢谢

Mass赋值通常意味着将属性传递到作为属性哈希的一部分创建对象的调用中。因此,请为该型号的
attr\u访问器列表添加
piece\u-lineup
字段,或者尝试以下操作:

@lineup = current_user.lineup
@lineup.piece_id = params[:piece_id]
@lineup.save
另见:


接受
创建一个属性编写器——在您的情况下,
工件列队属性=
——用于将属性传递给另一个模型。因此,您需要将
attr\u accessible:piece\u lineups\u属性添加到您的产品线模型中,以使其质量可分配

更新

有一个更好的办法

如果将
attr\u accessible:piece\u id
添加到您的产品线模型中,则将视图更改为

= form_for(@lineup) do |f|
  = f.hidden_field(:piece_ids, :value => piece.id)
  = f.submit

你根本不需要嵌套属性。

我认为你在
PieceLineup
中缺少
接受:piece
的嵌套属性。
这不起作用:(同样的错误,你能澄清一下你所说的“将piece\u-lineup的字段添加到属性访问器列表”是什么意思吗?谢谢,如果我接受你给出的非批量分配建议的话(第一个建议),我还需要在表单之前做-@lineup.piece\u-lineups.build(:piece=>piece)吗?@MatthewBerman你可以发布你的参数散列,这样我就可以更具体一些。“lineup”=>{“piece\u-lineups\u-attributes”=>{“0”=>{“piece\u-id”=>“1”=>{“piece\u-id”=>“1”}>,“提交”=>“更新列表”,“操作”=>“更新”,“控制器”=>“lineups”,“id”=>“2”}我尝试了这个,现在我得到了一个不同的批量分配错误:无法批量分配受保护的属性:piece\u id然后添加
attr\u accessible:piece\u id
到您的PieceLinup模型很好,现在我如何添加删除该关系的内容?
= form_for(@lineup) do |f|
  = f.hidden_field(:piece_ids, :value => piece.id)
  = f.submit