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}