可以暂时禁用Rails中开发任务的批量分配安全



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})

是否有一种简单的方法来禁用批量分配仅为开发脚本这样的?

这是大规模赋值保护的一个常见问题,也是Rails 4引入强参数的原因之一。这会将保护逻辑移到控制器中,所以如果你直接操作ActiveRecord对象,它就不会妨碍你。

你可以使用strong_parameters gem为Rails 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

本地绕过批量分配安全性的一个简单选项是发送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}

最新更新