strong rails permitted new false ruby-on-rails strong-parameters

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:

  1. Agregue la gem ''strong_parameters'' a su Gemfile y ejecute el paquete.

  2. Comente (o establezca en falso) config.active_record.whitelist_attributes = true en config / application.rb

  3. Mezcle 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)

  4. 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).