【问题标题】:What is mass-assignment in Rails 3什么是 Rails 3 中的质量分配
【发布时间】:2012-08-01 19:48:48
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

以下 sn-ps 执行 Post 模型的 nametopic 属性的质量分配:

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 存储库上的受信任密钥列表并将代码直接推送到存储库的错误他们不应该有访问权限。

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多