Ruby on rails 在模型中,何时使用attr\u访问器以及何时使用attr\u访问器?
默认情况下使用的是Ruby on rails 在模型中,何时使用attr\u访问器以及何时使用attr\u访问器?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,默认情况下使用的是attr\u accessible,但在railscasts的#250中,它使用的是attr\u accessor,所以我很困惑 在从头开始的身份验证教程中,代码是 class User < ActiveRecord::Base attr_accessible :email, :password, :password_confirmation attr_accessor :password ... end class用户
attr\u accessible
,但在railscasts的#250中,它使用的是attr\u accessor
,所以我很困惑
在从头开始的身份验证
教程中,代码是
class User < ActiveRecord::Base
attr_accessible :email, :password, :password_confirmation
attr_accessor :password
...
end
class用户
但在数据库中,它实际上只存储password\u hash和password\u salt,这与我们的attr\u accessible和attr\u accessor不匹配,有人能给我解释一下吗
attr\u accessible
指定可通过体量指定设置的模型属性白名单。()
attr_accessor
定义此模块的命名属性,其中名称为symbol.id2name,创建实例变量(@name)和相应的访问方法来读取它。还创建一个名为name=的方法来设置属性。()
因此,基本上,如果需要非数据库支持的属性,请使用attr\u accessible
。如果需要批量分配属性,无论该属性是否由数据库支持,请使用attr\u accessible
。如果您需要批量分配一个非数据库支持的attibute,您可以同时使用这两种方法
在您更新的问题中,这一切都是非常有意义的。在迁移中,
password\u散列
字段作为数据库支持的属性添加到模型中。然后在代码中,password
(及其确认)作为非数据库支持的属性添加。在保存模型之前,行before\u save:encrypt\u password
调用encrypt\u password
方法。在该方法中,数据库支持的属性派生自非数据库支持的属性。您不需要attr\u accessor:password\u hash
的原因是它从来都不是批量分配的(比如password
),而是显式设置的。有意义吗?属性访问器用于创建虚拟属性attr_可用于质量分配 根据教程
属性访问器:密码(因为密码字段不在数据库中)
属性可访问:密码,:密码确认(由于批量分配)
密码\u salt和密码\u hash仅在\u save callback之前才存在,因此无需在attr\u accessible或attr\u accessor中写入它们是否存在非数据库支持的属性的类型?不,它只获取它所获得的内容,而无需强制。