关于Rails上的ruby:如何通过has_many:through关系避免批量分配错误

how to avoid mass assignment error with has_many :through relationship

我正在尝试对嵌套模型进行update_attributes,并不断遇到批量分配错误。这是我的模型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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添加到阵容模型中,它会起作用,但事实并非如此。这是我的表格:

1
2
3
4
5
  - @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

和我的Lineup控制器动作:

1
2
3
  def update
    @lineup = current_user.lineup
    @lineup.update_attributes(params[:lineup])

最后是错误:

无法批量分配受保护的属性:piece_lineups_attributes

我在这里想念什么?谢谢!


accepts_nested_attributes_for创建一个属性编写器(在您的情况下为piece_lineups_attributes=),用于将属性传递给另一个模型。因此,您需要将attr_accessible :piece_lineups_attributes添加到Lineup模型以使其可大规模分配。

更新

对此有更好的解决方法。

如果将attr_accessible :piece_ids添加到阵容模型中,则将视图更改为

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

您根本不需要嵌套的属性。


质量分配通常意味着将属性传递到调用中,该调用将创建对象作为属性哈希的一部分。因此,将piece_lineup的字段添加到该模型的attr_accessors列表中,或尝试执行以下操作:

1
2
3
@lineup = current_user.lineup
@lineup.piece_id = params[:piece_id]
@lineup.save

另请参阅:

http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html