Rails 3.1 — Не удается массово назначить защищенные атрибуты (даже если они добавлены в attr_accessible)

#ruby-on-rails #ruby-on-rails-3 #ruby-on-rails-3.1

#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
  

Я перепробовал все варианты attr_accessible в модели хранилища:

 attr_accessible :categories
attr_accessible :category
attr_accessible :category_id
attr_accessible :category_ids
  

Ни один из них не работает! Обе эти модели являются has_and_belongs_to_many (и имеют объединяющую таблицу под названием categories_stores).

Любой совет был бы с благодарностью принят (я два дня бился головой об стену из-за этого).

Обновить

Я внедрил временное исправление (которое довольно избыточно и не нужно, если rails просто придерживался вышеуказанной проблемы). Я исправил это, перезаписав create метод для ActiveAdmin и выполнив цикл для вставки данных ассоциации:

   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
  

Комментарии:

1. Я даже пытался удалить attr_accessible для обеих моделей и все еще безуспешно!

Ответ №1:

Я полагаю, что если у вас есть объединяющая таблица под названием categories_stores, то ваши назначения будут больше похожи на:

 class Store

    has_many :categories, :through => :categories_stores
  

с аналогичной настройкой в модели категорий.

В вашей форме, скажем, если вы создаете хранилище и хотите создать / добавить категории для этого хранилища, тогда вам также может потребоваться добавить:

     accepts_nested_attributes_for :categories_stores
  

чтобы иметь возможность добавлять в эту таблицу.

Вы можете прочитать больше о вложенных атрибутах здесь: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

Комментарии:

1. У меня тоже была такая же проблема, и единственное решение, которое я смог найти, — это то, что предложила Стефани. Например. переключитесь на has_many: through и управляйте вложенным атрибутом CRUD для ассоциации join (store_categories), а не для ассоциации categories.