代码之家  ›  专栏  ›  技术社区  ›  Salil

attr\u accessible(*属性)和attr\u protected(*属性)之间有什么区别?

  •  35
  • Salil  · 技术社区  · 14 年前

    attr_accessible(*attributes) & attr_protected(*attributes) ? 举个例子就好了。

    我看到许多开发人员在他们的模型中使用这些。我在谷歌上搜索了它们的区别,但我不知道它们到底是什么。在不同的情况下,其重要性和必要性是什么?

    2 回复  |  直到 10 年前
        1
  •  100
  •   Jason Gilmore Felipe Skinner    10 年前

    attr_accessible ( documentation whitelisting .)

    鉴于

    attr_protected ( documentation blacklisting .)

    A. 只能显式修改(例如,通过 属性= )不能通过质量分配(例如使用 model.update_attributes 或者将属性传递给 new mass_assignment_sanitizer 设置(请参阅下面的更新)。

    典型的例子是 User 模型有一个 is_admin

    例子:

    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
    

    现在,假设 是管理员吗 属性受保护:

    > 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 3.2及更高版本中,可以通过设置 大量消毒剂 在配置中。默认情况是只记录尝试并允许代码继续执行,但是标准的开发环境配置将此设置为 :strict 在尝试更新受保护的属性时引发异常。

        2
  •  7
  •   gregor    14 年前

    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\u protected是一个大规模分配的黑名单。。。

    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