22

我听说有几个人抱怨并发布了有关 Rails 中的大规模分配的问题。我有几次同样的错误,我所做的只是attr_accessible。但究竟什么是批量分配?有人可以举例解释吗?

4

1 回答 1

45

Mass Assignment是 Rails 赋予使用参数​​哈希构造对象的行为的名称。它是“批量赋值”,因为您通过单个赋值运算符将多个值分配给属性。

以下片段执行模型的nametopic属性的质量分配Post

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

最近,必须通过 a 手动将属性列入白名单attr_accessible才能使批量分配成功,这已成为默认设置。在此之前,默认情况下属性是可分配的,除非它们被明确列入黑名单attr_protected或任何其他属性被列入白名单attr_acessible.

考虑可以批量分配哪些属性很重要,因为这样的代码很常见:

@post = Post.new(params[:post])

通常,当用户提交由form_for @post. 在理想的世界中,params[:post]散列应该只包含我们在表单上显示的字段。但是,用户在他们的请求中传递额外的字段是微不足道的,因此实际上您允许用户在 上设置任何字段@post,而不仅仅是表单上显示的字段。

未能安全地使用批量分配导致了一些相当大的 Rails 应用程序中的几个引人注目的错误,例如允许某人将自己的公钥注入 Github 存储库上的受信任密钥列表并将代码直接推送到他们的存储库。不应该访问。

于 2012-08-03T18:26:41.140 回答