attr_accessible(* attributes)和attr_protected(* attributes)有什么区别?
attr_accessible(*attributes)
和attr_protected(*attributes)
什么attr_protected(*attributes)
? 例子会很好。
我看到很多开发者在他们的模型中使用这些。 我search了不同的地方,但我不明白他们是什么。 在不同的情况下,重要性和必要性是什么?
attr_accessible
( 文档 )说:“指定的属性是可访问的,所有其他的都受保护”(将其视为白名单) 。
而
attr_protected
( 文档 )表示“指定的属性受到保护,其他所有属性都可访问”(将其视为黑名单) 。
受保护的属性是一个只能被显式修改的属性 (例如通过属性= ),不能通过批量赋值来更新(例如,使用model.update_attributes
或将属性传递给new
属性)。 尝试通过质量分配更新受保护属性时的行为取决于mass_assignment_sanitizer
设置(请参阅下面的更新)。
经典的例子是,如果User
模型有一个is_admin
属性,你可以保护该属性,以防止表单提交,允许任何用户被设置为pipe理员。
例:
class User < ActiveRecord::Base # explicitly protect is_admin, any new attributes added to the model # in future will be unprotected so we need to remember to come back # and add any other sensitive attributes here in the future attr_protected :is_admin end
和….相比:
class User < ActiveRecord::Base # explicitly unprotect name and bio, any new attributes added to the model # in the future will need to be listed here if we want them to be accessible attr_accessible :name, :bio end
现在,假设is_admin
属性被保护:
> u = User.find_by_name('mikej') > u.is_admin? false > u.update_attributes(:name => 'new name', :is_admin => true) > u.is_admin? false > u.name "new name" > u.is_admin = true # setting it explicitly > u.save > u.is_admin? true
更新:Rails的更新版本引入了质量分配消毒剂的概念,以控制试图通过质量分配来更新受保护属性时的行为。 在Rails 3.2及更高版本中,可以通过在config中设置mass_assignment_sanitizer
来控制。 默认情况下,只logging这些尝试并允许继续执行代码,但标准开发环境configuration将其设置为:strict
,在试图更新受保护的属性时引发exception。
attr_accessible是一个白名单大规模转让…
class Foo < ActiveRecord::Base #has attributes foo and bar attr_accessible :foo end f = Foo.new :foo => "test", :bar => "test" f.foo #=> "test" f.bar #=> nil
attr_proteceted是一个黑名单,用于批量分配…
class Foo < ActiveRecord::Base #has attributes foo and bar attr_protected :bar end f = Foo.new :foo => "test", :bar => "test" f.foo #=> "test" f.bar #=> nil