Mass Assignment 是 Rails 赋予使用参数哈希构造对象的行为的名称。它是“批量赋值”,因为您通过单个赋值运算符为属性分配多个值。
以下 sn-ps 执行 Post 模型的 name 和 topic 属性的质量分配:
Post.new(:name => "John", :topic => "Something")
Post.create(:name => "John", :topic => "Something")
Post.update_attributes(:name => "John", :topic => "Something")
为了使其工作,您的模型必须允许对您传入的哈希中的每个属性进行批量分配。
有两种情况会失败:
- 您有一个
attr_accessible 声明,它不包含:name
- 你有一个
attr_protected,确实包括:name
最近成为默认设置,必须通过attr_accessible 手动将属性列入白名单才能成功进行批量分配。在此之前,默认属性是可分配的,除非它们被明确列入黑名单 attr_protected 或任何 other 属性被列入白名单 attr_acessible.
考虑哪些属性可以批量分配很重要,因为这样的代码很常见:
@post = Post.new(params[:post])
这通常在用户提交由form_for @post 呈现的表单时使用。在理想情况下,params[:post] 哈希应该只包含我们在表单上显示的字段。然而,用户在他们的请求中传递额外的字段是微不足道的,因此实际上您允许用户在@post 上设置 any 字段,而不仅仅是表单上显示的字段.
未能安全地使用批量分配导致了一些相当大的 Rails 应用程序中的几个引人注目的错误,例如允许某人将 inject their own public key 放入 Github 存储库上的受信任密钥列表并将代码直接推送到存储库的错误他们不应该有访问权限。