Rails 3.1 - 无法批量分配受保护的属性(即使添加到attr_accessible)

Hop*_*eam 5 ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

我有一个嵌套的表单categories,stores并在商店模型中将其列为attr_accessible.但仍然会收到以下错误:

WARNING: Can't mass-assign protected attributes: category_ids
Run Code Online (Sandbox Code Playgroud)

我已经尝试了商店模型中attr_accessible的所有变体:

attr_accessible :categories
attr_accessible :category
attr_accessible :category_id
attr_accessible :category_ids
Run Code Online (Sandbox Code Playgroud)

他们都没有工作!这两个模型都是has_and_belongs_to_many(并且有一个名为categories_stores的连接表).

任何建议都会非常感激(我已经把头撞到墙上两天了).

UPDATE

我已经实现了一个临时修复(这非常冗余,如果rails只是坚持上述问题则不需要).我通过覆盖createActiveAdmin 的方法并循环插入关联数据来修复它:

  controller do
    def update
      @store = store.find(params[:id])
      if @store.update_attributes(params[:store])
        @store.categories.delete_all
        params[:store][:category_ids].each do |category_id|
          @store.categories << Category.find(category_id) unless category_id.blank?
        end
        redirect_to :action => :index
      else
        redirect_to :action => :edit, :notice => "Something f'ed up"
      end
    end

  end
Run Code Online (Sandbox Code Playgroud)

Ste*_*ose 4

我相信,如果您有一个名为categories_stores的连接表,那么您的分配将更符合以下内容:

class Store

    has_many :categories, :through => :categories_stores
Run Code Online (Sandbox Code Playgroud)

在类别模型中具有类似的设置。

在您的表单中,如果您正在创建一个商店,并且您想要为该商店创建/添加类别,那么您可能还需要添加:

    accepts_nested_attributes_for :categories_stores
Run Code Online (Sandbox Code Playgroud)

能够添加到该表中。

您可以在此处阅读有关嵌套属性的更多信息:http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html