Сильные параметры в рельсах 3.2.8
В этом видео указано, что можно защитить вход, поступающий через контроллер, но все же иметь возможность выполнять массовое присвоение через модели и спецификации, Тем не менее, я не видел, чтобы это было зафиксировано как функция при использовании сильных_параметров в 3.2.8.
Я понимаю, что мне нужно смешать в ActiveModel::ForbiddenAttributesProtection
в моих моделях и установить config.active_record.whitelist_attributes = false
в config/application.rb
. Я также вытащил все мои вызовы attr_accessible
из модели.
С миксином или без него возникают ошибки массового присвоения.
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: home_phone, cell_phone
Я что-то пропустил?
Ответы
Ответ 1
Предлагаемый RailsCast, вероятно, хороший старт, но вот резюме того, что вы должны сделать в Rails3.x, чтобы получить сильные параметры, работающие вместо attr_accessible:
-
Добавьте gem 'strong_parameters'
в свой Gemfile и запустите пакет.
-
Комментарий (или значение false) config.active_record.whitelist_attributes = true
в config/application.rb
-
Смешайте в ActiveModel::ForbiddenAttributesProtection
в своей модели (railscast предлагает сделать это в новом инициализаторе, config/initializers/strong_parameters.rb ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
)
-
С этого момента вам придется использовать синтаксис, например:
model_params = params[:model].permit( :attribute, :another_attribute )
@model.update_attributes( model_params )
когда вы обновляете свои модели. В этом случае любой атрибут в params[:model]
кроме :attribute
и :another_attribute
приведет к ошибке ActiveModel:: ForbiddenAttributes.
Вы также можете использовать остальную часть новой магии от ActionController::Parameters
, например .require(:attribute)
, чтобы заставить присутствие атрибута.
Ответ 2
Это не то же самое, что и ваша проблема, но может возникнуть проблема с получением MassAssignmentSecurity:: Error. Я столкнулся с проблемой, по которой атрибуты "id" и "type" кажутся защищенными по умолчанию, даже когда я принял предписанные шаги, чтобы переключиться на использование сильных параметров, а не защиту массового присвоения. У меня была ассоциация с именем "тип", которую я переименовал в "project_type" для решения проблемы (этот атрибут уже был project_type_id).