什么是Rails 3中的批量分配

Bhu*_*dha 21 activerecord mass-assignment ruby-on-rails-3

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

mea*_*gar 41

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

以下代码段执行模型的nameand topic属性的质量分配Post:

Post.new(:name => "John", :topic => "Something")
Post.create(:name => "John", :topic => "Something")
Post.update_attributes(:name => "John", :topic => "Something")
Run Code Online (Sandbox Code Playgroud)

为了使其正常工作,您的模型必须允许您传入的哈希中每个属性的批量分配.

有两种情况会失败:

  • 你有一个包括的attr_accessible声明:name
  • 您有attr_protected哪些包括:name

它最近成为默认属性必须通过a手动白名单attr_accessible,以便大规模分配成功.在此之前,默认情况下,属性可以分配,除非它们明确地列入黑名单attr_protected或任何其他属性列入白名单attr_acessible.

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

@post = Post.new(params[:post])
Run Code Online (Sandbox Code Playgroud)

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

未能安全地使用批量分配导致一些非常大的Rails应用程序中的几个高调错误,例如允许某人将自己的公钥注入Github存储库中的可信密钥列表并将代码直接推送到存储库的那个不应该有权访问.