在模型中,何时使用attr_accessor以及何时使用attr_accessible?

时间:2013-05-25 05:02:21

标签: ruby-on-rails ruby ruby-on-rails-3

默认情况下使用

attr_accessible,但在railscast中的#250中,它使用attr_accessor,所以我很困惑。

Authentication from Scratch教程中,代码是

class User < ActiveRecord::Base
  attr_accessible :email, :password, :password_confirmation
  attr_accessor :password
  ...
end

但是在数据库中,它实际上只存储了password_hash和password_salt,它们与我们的attr_accessible和attr_accessor不匹配,任何人都可以为我解释一下吗?

2 个答案:

答案 0 :(得分:2)

attr_accessible指定可通过质量分配设置的模型属性的白名单。 (source

attr_accessor为此模块定义了一个命名属性,其名称为symbol.id2name,创建了一个实例变量(@name)和一个相应的访问方法来读取它。还创建一个名为name =的方法来设置属性。 (source

因此,基本上,如果您需要非数据库支持的属性,请使用attr_accessible。如果您需要批量分配属性,无论它是否由数据库支持,请使用attr_accessible。如果您需要批量分配非数据库支持的属性,则可以使用两者。

在您更新的问题中,这一切都非常有意义。在迁移中,password_hash字段将作为db-backed属性添加到模型中。然后在代码中,password(及其确认)被添加为非数据库支持的属性。在保存模型之前,行before_save :encrypt_password会调用encrypt_password方法。在该方法中,数据库支持的属性派生自非数据库支持的属性。您不需要attr_accessor :password_hash的原因是因为它从未进行质量分配(如password),而是明确设置。有意义吗?

答案 1 :(得分:0)

attr_accessor用于创建虚拟属性
attr_accessible用于质量分配

根据教程
attr_accessor:密码(因为密码字段不在数据库中)
attr_accessible:password,:password_confirmation(由于质量分配)

password_salt和password_hash只在before_save回调中,所以不需要在attr_accessible或attr_accessor中写这些