Rails 4.2 ActiveModel::ForbiddenAttributesError при сохранении модели с ассоциацией

У меня есть приложение, отлично работающее на Rails 4.0.3. Сегодня, когда я пытаюсь перейти на Rails 4.2.0, произошла ошибка с кодом ниже:

    def self.create_comp(comp)
        c= Competition.new(comp[:competition])
        # add activities
        comp[:activities].each do |act|
            c.activities.new(act)
        end

        c.save!
        c
    end

И сообщение об ошибке:

ActiveModel::ForbiddenAttributesError (ActiveModel::ForbiddenAttributesError):

Что делает эта функция, так это сохраняет конкуренцию со связанными с ней действиями в транзакции.

У меня есть следующая строка, определенная как ассоциация:

has_many :activities, autosave: true

Так что же было изменено в Rails 4.2, чтобы вызвать это исключение?


person fuyi    schedule 21.01.2015    source источник
comment
stackoverflow.com/questions/17450185/   -  person pierallard    schedule 21.01.2015


Ответы (1)


@xiaopang, Rails 4.2 допускает только строгие параметры, поэтому вы можете определить частный метод, в котором вы должны разрешать атрибуты уровня модели вместе со связанными атрибутами таким образом.

def method
  params.require(:competition).permit!.tap do |while_listed|
    while_listed[:activities] = params[:activities]
  end
end

Теперь передайте этот частный метод при вызове метода класса (create_comp).

Пусть это решит вашу проблему.

У вас есть еще один способ решить вашу проблему, например - определить частный метод в вашем контроллере и отправить имя этого метода в качестве параметра.

def activities_params
  params.require(:activities).permit!
end

Это позволит создать связанный объект модели.

person Chitra    schedule 23.01.2015
comment
params.require(:competition).permit! работает для моего случая. но это оставляет сильный параметр бесполезным, верно? - person fuyi; 05.03.2015
comment
@xiaopang, нет, это не оставляет сильного параметра. Чтобы внести в белый список весь хэш параметров, разрешение! можно использовать метод. - person Chitra; 07.03.2015