什么是 Rails 3 中的质量分配
Posted
技术标签:
【中文标题】什么是 Rails 3 中的质量分配【英文标题】:What is mass-assignment in Rails 3 【发布时间】:2012-08-01 19:48:48 【问题描述】:我听说有几个人抱怨并发布了有关 Rails 中的批量分配的问题。我有几次同样的错误,我所做的只是attr_accessible
。但究竟什么是批量分配?有人可以举例说明吗?
【问题讨论】:
看看这个:railscasts.com/episodes/26-hackers-love-mass-assignment。虽然它可能有点过时,但核心原则保持不变。 注意:Rails 4 使用控制器中的 strong parameters 而不是模型中的保护可以更好地处理质量分配。有关什么是质量分配和 Rails 3/4 技术的详细解释,请参阅 this article。 【参考方案1】: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 存储库上的受信任密钥列表并将代码直接推送到存储库的错误他们不应该有访问权限。
【讨论】:
以上是关于什么是 Rails 3 中的质量分配的主要内容,如果未能解决你的问题,请参考以下文章