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

这里有一个优雅的答案。

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 回答
3

这是批量分配保护的常见问题,也是 Rails 4 中引入强参数的原因之一。这会将保护逻辑移到控制器中,因此如果您正在操作 ActiveRecord,它不会妨碍您直接对象。

您可以使用strong_parameters gem为 Rails 3 应用程序获得相同的行为。

于 2013-01-21T12:24:17.213 回答
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 回答