attr_accessible(*attributes)attr_accessible(*attributes)之间有什么区别;attr_protected(*attributes)? 举个例子就好了.

我看到许多开发人员在他们的模型中使用这些.我在谷歌上搜索差异,但我不知道它们到底是什么.在不同的场景中,它的重要性和必要性是什么?

推荐答案

attr_accessible(documentation)表示"指定的属性是可访问的,所有其他属性都受到保护"(将其视为whitelisting)

鉴于

attr_protected(documentation)表示"指定的属性受到保护,所有其他属性都可以访问"(将其视为blacklisting)

protected attribute只能被明确修改(例如,通过attribute=),不能通过质量分配(例如,使用model.update_attributes或通过将属性传递给new)进行更新.try 通过质量分配更新受保护属性时的行为取决于mass_assignment_sanitizer设置(请参阅下面的更新).

classic 的例子是,如果一个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

现在,假设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的更高版本引入了a mass assignment sanitizer的概念,以控制试图通过大规模分配更新受保护属性时的行为.在Rails 3.2及更高版本中,这可以通过在配置中设置mass_assignment_sanitizer来控制.默认情况下,只记录try 并允许代码继续执行,但标准的environment config for development将其设置为:strict,这会在try 更新受保护属性时引发异常.

Ruby-on-rails相关问答推荐

如何将Form_With用于多个没有控制器的型号

如何从 Rails7.2 中的控制器获取名称空间?

使用拆分成多个部分的种子文件进行Rails数据种植

Ruby on Rails 7 与 React 集成

有没有一种简单的方法可以让 pow 为 https 服务?

Factory Girl + Mongoid 在fixture 中嵌入文档

使用 RSpec 和 Capybara (Rails) 测试重定向

如果 URL 不存在,请将 http(s) 添加到 URL?

在 Rails 4 中检测用户代理 - 读取 HTTP 标头

Rails - 使用 %W

使用 RSpec 2 关闭一个规范的事务性固定装置

如何在 rspec 测试中输出变量?

如何验证 ActiveRecord 中邮箱字段的格式?

如何在 Rails 1.2.3 中使复选框默认为选中?

使 rails 控制台输出更漂亮一点

您将 Rack 中间件文件和要求放在哪里?

你如何覆盖 form_for 助手中的类名?

如何在两个字段上对 ruby​​/rails 进行排序?

Ruby 1.9.2 和 Rails 3 无法打开 rails 控制台

Rails:您已经激活了 rake 10.3.1,但您的 Gemfile 需要 rake 10.2.2 (Gem::LoadError)