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