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不匹配,任何人都可以为我解释一下吗?
答案 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中写这些