1

大量割り当て時に存在する保護された変数を無視するように Ruby (Rails) に指示するにはどうすればよいですか?

class MyClass < ActiveRecord::Base
    attr_accessible :name, :age
end

ここで、ハッシュを一括割り当てして、新しい を作成しますMyClass

MyClass.create!({:name => "John", :age => 25, :id => 2})

これは私に例外を与えます:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: id

指定された(保護されていない)属性で新しいを作成し、MyClass属性を無視したいid

余談ですが、不明な属性も無視するにはどうすればよいですか。たとえば、 には属性MyClassがありません。location一括割り当てしようとしても、無視してください。

4

5 に答える 5

5

実際に割り当てたいキーのみを選択するために使用Hash#sliceします。

# Pass only :name and :age to create!
MyClass.create!(params.slice(:name, :age))

通常、コントローラーにラッパーメソッドを追加paramsして、割り当てたいことがわかっているフィールドのみにフィルターします。

class MyController

  # ...

  def create
    @my_instance = MyClass.create!(create_params)
  end

protected

  def create_params
    params.slice(:name, :age)
  end
end
于 2013-02-21T17:46:54.047 に答える
3

開発とテストで問題mass_assignment_sanitizerを解決する設定。:logger

config.active_record.mass_assignment_sanitizer = :logger
于 2013-02-21T18:38:54.207 に答える
1

Rails4にあるstrong_parametersgemを使用できます。

こちらのドキュメントを参照してください。

このようにして、たとえば、アクションまたはロールごとに必要なパラメーターを指定できます。

于 2013-02-21T18:37:30.187 に答える
0

ActiveModel::MassAssignmentSecurity::Errors をグローバルに無効にせずに、モデルの属性のみを動的に通過させたい場合は、次のようにします。

params = {:name => "John", :age => 25, :id => 2}
MyClass.create!(params.slice(*MyClass.new.attributes.symbolize_keys.keys)

この状況のように、ハッシュでシンボルを使用している場合は .symbolize_keys が必要ですが、必要ない場合もあります。

于 2013-05-09T13:48:32.760 に答える