ruby-on-rails - rails - strong parameters nested attributes
ParĂ¡metros fuertes en rieles 3.2.8 (2)
Este video indica que es posible proteger la entrada que llega a través del controlador y aún así poder realizar una asignación en masa a través de modelos y especificaciones. Sin embargo, no he visto esto documentado como una característica al usar strong_parameters en 3.2.8.
Entiendo que necesito mezclar ActiveModel::ForbiddenAttributesProtection
en mis modelos y configurar config.active_record.whitelist_attributes = false
en config/application.rb
. También he sacado todas mis llamadas attr_accessible
del modelo.
Con o sin la mezcla estoy recibiendo errores de asignación de masa.
ActiveModel::MassAssignmentSecurity::Error: Can''t mass-assign protected attributes: home_phone, cell_phone
¿Me estoy perdiendo de algo?
El railscasts.com/episodes/371-strong-parameters?view=asciicast sugerido es probablemente un buen comienzo, pero aquí hay un resumen de lo que tiene que hacer en Rails 3.x para que los parámetros sólidos funcionen en lugar de attr_accessible:
Agregue la
gem ''strong_parameters''
a su Gemfile y ejecute el paquete.Comente (o establezca en falso)
config.active_record.whitelist_attributes = true
en config / application.rbMezcle el modelo
ActiveModel::ForbiddenAttributesProtection
en su modelo. Haga esto por modelo, o aplique globalmente a todos los modelos con:ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
(El railscast propone hacer esto en un nuevo inicializador: config / initializers / strong_parameters.rb)
De ahora en adelante tendrás que usar una sintaxis como esta:
model_params = params[:model].permit( :attribute, :another_attribute ) @model.update_attributes( model_params )
Cuando actualizas tus modelos. En este caso, cualquier atributo en
params[:model]
excepto:attribute
y:another_attribute
causará un error ActiveModel :: ForbiddenAttributes.
También puede usar el resto de la nueva magia de ActionController::Parameters
, como .require(:attribute)
para forzar la presencia de un atributo.
No es lo mismo que su problema, pero puede surgir para que otra persona obtenga MassAssignmentSecurity :: Error. He detectado un problema en el que los atributos ''id'' y ''type'' parecen estar protegidos de forma predeterminada, incluso cuando había tomado los pasos prescritos para cambiar a usar parámetros fuertes en lugar de la protección de asignación en masa. Tuve una asociación llamada ''tipo'' que cambié de nombre a ''tipo_proyecto'' para resolver el problema (el atributo ya era tipo_de_proyecto).