什么是Rails 3中的批量分配

时间:2012-08-03 18:20:33

标签: ruby-on-rails-3 activerecord mass-assignment

我听过几个人抱怨并在Rails中发布有关群发作业的问题。我有几次同样的错误,我所做的只是attr_accessible。但是什么是大规模任务?有人可以用例子来解释吗?

1 个答案:

答案 0 :(得分:41)

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

以下代码段对name模型的topicPost属性执行质量分配:

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或任何其他属性列在白名单中attr_acessible.

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

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

通常,当用户提交由form_for @post呈现的表单时,会使用此选项。在理想的世界中,params[:post]哈希应该只包含我们在表单上显示的字段。但是,用户在其请求中传递其他字段非常容易,因此实际上您允许用户在@post上设置任何字段,而不仅仅是在{{1}}上显示的字段。形式。

在一些非常大的Rails应用程序中,未能安全地使用批量分配导致了一些高调的错误,例如允许某人{G}去存储在Github存储库中的可信密钥列表并将代码直接推送到他们不应该访问的存储库。