2012-12-13 15 views
14

This videoは、コントローラを介して入力される入力を保護することはできますが、モデルや仕様による質量割り当ては依然として可能であると述べています。しかし、3.2.8でstrong_parametersを使用しているときに、これが機能として文書化されているのを見たことはありません。Railsの強力なパラメータ3.2.8

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

私は何かが足りないのですか?

+2

'attr_protected:home_phone、:cell_phone'を実行すると、それらは一括割り当てできなくなります。 – VenkatK

+1

残念ながら私のモデルには 'attr_protected'もありません。しかし、私は同じエラーが発生しています。 –

+0

@ brandon-hansen - あなたはこの件についてRyan Batesの鉄道を見ましたか? http://railscasts.com/episodes/371-strong-parameters?view=asciicast – simonmorley

答えて

19

ザ・はRailsCastを示唆したが、おそらく良いスタートですが、ここではあなたの代わりにattr_accessibleの作業の強いパラメータを取得するためにRails3.xに何をすべきかをまとめたものです:

  1. は、あなたのGemfileにgem 'strong_parameters'を追加し、バンドルを実行します。

  2. コメントアウト(またはfalseに設定)、モデル内のActiveModel::ForbiddenAttributesProtection内のconfig/application.rb

  3. ミックスでconfig.active_record.whitelist_attributes = true(railscastは新しいイニシャライザ、設定/初期化子/ strong_parametersでこれを行うことを提案しています。 RB ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection))あなたはこのような構文を使用する必要がありますこれから

  4. :あなたがあなたのモデルを更新

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

    。この場合、:attribute:another_attributeを除くparams[:model]の属性は、ActiveModel :: ForbiddenAttributesエラーを引き起こします。あなたはまた、属性の存在を強制するためにこのような.require(:attribute)として、ActionController::Parametersから新しい魔法の残りの部分を使用することができます

+0

まだ動作しています。これは受け入れるべきです。 –

2

あなたの問題と同じではありませんが、他の誰かがMassAssignmentSecurity :: Errorを取得する可能性があります。私は、idアトリビュートとtypeアトリビュートが、大量のアサインメント保護ではなく、強いパラメータを使用するように所定の手順を踏んだ場合でも、デフォルトでプロテクトされているように見えるという問題に直面しました。私は 'type'という名前のアソシエーションを持っていましたが、この名前を 'project_type'に変更して問題を解決しました(属性はすでにproject_type_idでした)。

+0

RailsはSTIリレーションを追跡するために属性やリレーションシップに 'type'を使用するのは悪い考えです。それは多かれ少なかれ予約属性です:)また、 'id'はルータによっていくつかのケースで設定されるデフォルトのパラメータですので、同様に使用するのが不安定かもしれません。 –

+0

@ d-Pixie Fairしかし、私が得たエラーは本当に役に立たず、とても混乱していました。それらを使用しないというエラーは問題ありません.MassAssignmentSecurity :: Errorは、システム全体が無効にされていたときに非常に混乱していました。私がヒットしたのはタイプで、私がソースコードを掘ったときにIDが影響を受けていたことがわかりました。 –

+0

同じ問題がありますが、エラーは説明的ではありません。 STIを使用していない場合は、 'self.inheritance_column = nil'を使用して修正してください。 – toxaq