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中写入它们

是否存在非数据库支持的属性的类型?不,它只获取它所获得的内容,而无需强制。