2

attr_accessible默认情况下使用,但在 railscasts 的 #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不匹配,谁能帮我解释一下?

4

2 回答 2

2

attr_accessible指定可以通过批量分配设置的模型属性的白名单。(来源

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

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

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

于 2013-05-25T05:06:25.690 回答
0

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

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

password_salt 和 password_hash 仅在 before_save 回调中,因此无需将它们写入 attr_accessible 或 attr_accessor

于 2013-05-25T05:38:02.327 回答