17

このビデオでは、コントローラーを介して入ってくる入力を保護しながら、モデルとスペックを介して大量の割り当てを行うことができると述べています。ただし、3.2.8 で strong_parameters を使用する場合、これが機能として文書化されているのを見たことがありません。

私はActiveModel::ForbiddenAttributesProtection自分のモデルに混ぜconfig.active_record.whitelist_attributes = falseconfig/application.rb. attr_accessibleまた、モデルからすべての呼び出しを取得しました。

ミックスインの有無にかかわらず、大量割り当てエラーが発生します。

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: home_phone, cell_phone

何か不足していますか?

4

2 に答える 2

23

提案されたRailsCastはおそらく良いスタートですが、attr_accessibleの代わりに強力なパラメーターを機能させるためにRails3.xで実行する必要があることの要約を次に示します。

  1. gem 'strong_parameters'Gemfileに追加して、バンドルを実行します。

  2. config.active_record.whitelist_attributes = trueconfig / application.rbでコメントアウト(またはfalseに設定)

  3. ActiveModel::ForbiddenAttributesProtectionモデルに混ぜます。モデルごとにこれを行うか、次のすべてのモデルにグローバルに適用します。

    ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)

    (railscastは、新しい初期化子config / initializers / strong_parameters.rbでこれを行うことを提案しています)

  4. 今後は、次のような構文を使用する必要があります。

    model_params = params[:model].permit( :attribute, :another_attribute )
    @model.update_attributes( model_params )
    

    モデルを更新するとき。この場合、を除くすべての属性によりparams[:model]、ActiveModel::ForbiddenAttributesエラーが発生します。:attribute:another_attribute

属性の存在を強制するActionController::Parametersなど、からの新しい魔法の残りを使用することもできます。.require(:attribute)

于 2013-01-10T07:42:43.850 に答える
2

これはあなたの問題と同じではありませんが、他の誰かがMassAssignmentSecurity::Errorを取得している場合に発生する可能性があります。一括割り当て保護ではなく強力なパラメーターの使用に切り替えるための所定の手順を実行した場合でも、「id」属性と「type」属性がデフォルトで保護されているように見えるという問題が発生しました。問題を解決するために「type」という名前の関連付けを「project_type」に名前変更しました(属性はすでにproject_type_idでした)。

于 2013-01-12T12:10:44.840 に答える