2

Rails の一括代入セキュリティ機能は、プロダクション コードに最適です。しかし、データベースのシードなどを行っているときは、より簡潔な構文を使用して一括割り当てできるようにしたいと考えています。

joe = User.create!(name: 'Joe', email: 'joe@blow.com')
model = MyModel.new
model.update_attributes({name: 'Mod', description: 'blah', creator: joe},
                        as: :admin, without_protection: true)
model.save!

そのような

joe = User.create!(name: 'Joe', email: 'joe@blow.com')
MyModel.create!({name: 'Mod', description: 'blah', creator: joe})

これらのような開発スクリプトに対してのみ一括割り当てを無効にする簡単な方法はありますか?

4

3 に答える 3

3

これは、大量割り当て保護の一般的な問題であり、Rails 4に強力なパラメーターが導入されている理由の1つです。これにより、保護ロジックがコントローラーに移動するため、ActiveRecordを操作している場合に邪魔になりません。オブジェクトを直接。

strong_parameters gemを使用して、 Rails3アプリでこれと同じ動作を得ることができます。

于 2013-01-21T12:24:17.213 に答える
3

1 つのエレガントな答えがここにあります。

class ActiveRecord::Base
  attr_accessible
  attr_accessor :accessible

  private

  def mass_assignment_authorizer
    if accessible == :all
      self.class.protected_attributes
    else
      super + (accessible || [])
    end
  end
end

スキップしたい場所はどこでも:

@your_object.accessible = :all
于 2013-01-21T09:53:45.040 に答える
0

一括代入セキュリティをローカルでバイパスする簡単なオプションは、次のように val= 呼び出しを送信することです。

def create_user_with_values(args)
  inst = User.new
  args.each { |k,v |
     inst.__send__ "#{k.to_s}=",v
  }
  inst.save!
end

次のように呼び出します。

create_user_with_values {name: 'Mod', description: 'blah', creator: joe}
于 2014-03-20T20:38:18.970 に答える