attr_accessible如何在Rails中工作?

时间:2011-08-24 18:32:53

标签: ruby-on-rails ruby ruby-on-rails-3

我刚才有一个关于Ruby on Rails的一般性问题以及模型中的attr_accessible属性(Rails 3)。有人可以解释那里应该定义哪些模型属性?我记得关于大规模任务风险的事情,虽然我在这方面不太了解......谢谢:)

4 个答案:

答案 0 :(得分:5)

想象一下包含一些字段的订单类:

Order.new({ :type => 'Corn', :quantity => 6 })

现在假设订单也有折扣码,比如:price_off。您不希望将price_off标记为attr_accessible。这可以阻止恶意代码制作一个最终做类似事情的帖子:

Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })

即使您的表单没有以下字段:price_off,如果默认情况下它只在您的模型中,则可用。精心设计的POST仍然可以设置它。

使用attr_accessible白名单可以批量分配这些内容并保护您希望在代码中明确控制的字段。

Difference between attr_accessor and attr_accessible还有一些其他链接。

答案 1 :(得分:4)

attr_accessible允许您在模型上定义可以批量分配的属性白名单。因此,如果你有10个attrs但只有3个白名单,那么只有那三个可以被批量分配。

class Foo < ActiveRecord:Base
  #lets say you have attrs one, two, three
  attr_accessible :one, :two
end

#You can do this:
Foo.new({:one => 1, :two => 2})

#if you were to do this:
Foo.new({:one => 1, :two => 2, :three => 3})
#Foo's three attr would not be set

答案 2 :(得分:1)

Rails ActiveRecord documentation在这个主题上有一些很好的细节。

基本上是attr_accessible:

  

指定可以通过设置的模型属性的白名单   质量分配。

attr_protected:

  

只需忽略对这些属性的批量分配即可进行分配   他们可以使用直接编写方法。这是为了保护   敏感属性被恶意用户覆盖   篡改网址或表单。

将attr_accessible视为您希望用户能够通过表单设置的属性列表,此列表中不存在的任何内容都无法通过质量分配进行设置,从而确保您将敏感值保留在数据库受恶意用户保护。这是保证应用程序安全的一小步,如果您想要遵循Rails最佳实践,您应该查看Rails Security Guide

答案 3 :(得分:0)

attr_accessible是rails功能,借助它我们可以允许模型属性的质量分配。它与功能中的attr_protected正好相反。

要使特定属性可用于质量分配,我们使用attr_accessible,如下所示:

class Person < ActiveRecord::Base
attr_accessible : name
end



有关attr_accessibleStrong parameters的更详细说明,请访问以下链接:

[http://findnerd.com/list/view/attr-accessible-in-Rails-4/3654/][1]