attr_accessible如何在Rails中工作?

trf*_*ach 5 ruby ruby-on-rails ruby-on-rails-3

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

Pau*_*bel 5

想象一下带有一些字段的订单类:

Order.new({ :type => 'Corn', :quantity => 6 })
Run Code Online (Sandbox Code Playgroud)

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

Order.new({ :type => 'Corn', :quantity => 6, :price_off => 30 })
Run Code Online (Sandbox Code Playgroud)

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

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

attr_accessor和attr_accessible之间的区别有一些额外的链接.


Jak*_*sey 4

attr_accessible 允许您在模型上定义可批量分配的属性白名单。因此,如果您有 10 个属性,但只将其中 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
Run Code Online (Sandbox Code Playgroud)