【问题标题】:how to avoid mass assignment error with has_many :through relationship如何使用 has_many 避免批量分配错误:通过关系
【发布时间】:2012-06-23 06:28:36
【问题描述】:

我正在尝试对嵌套模型进行 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

我在这里缺少什么?谢谢!

【问题讨论】:

  • 我认为你在PieceLineup 中缺少accepts_nested_attributes_for :piece
  • 这不起作用:(同样的错误

标签: ruby-on-rails activerecord nested-attributes mass-assignment


【解决方案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

【讨论】:

  • 您能否阐明“将piece_lineup 的字段添加到您的attr_accessors 列表”的意思?谢谢
  • 另外,如果我执行您提供的非批量分配建议(第一个建议),我还需要在表单之前执行 - @lineup.piece_lineups.build(:piece => piece) ?
  • @MatthewBerman 你能发布你的参数哈希,以便我可以更具体。
  • "lineup"=>{"piece_lineups_attributes"=>{"0"=>{"piece_id"=>"1", "id"=>"4"}, "1"=> {"piece_id"=>"1"}}}, "commit"=>"更新阵容", "action"=>"update", "controller"=>"lineups", "id"=>"2"}
【解决方案2】:

accepts_nested_attributes_for 创建一个属性编写器——在你的例子中,piece_lineups_attributes=——用于将属性传递给另一个模型。因此,您需要将 attr_accessible :piece_lineups_attributes 添加到您的 Lineup 模型中以使其可批量分配。

更新

有更好的方法来解决这个问题。

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

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

您根本不需要嵌套属性。

【讨论】:

  • 我现在尝试了这个我得到一个不同的批量分配错误:无法批量分配受保护的属性:piece_id
  • 然后将attr_accessible :piece_id 添加到您的 PieceLinup 模型中
  • 太棒了,现在我如何添加一些东西来删除这种关系?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多