我正在关注Michael Hartls的rails教程。这是User模型类。
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :nick_name
has_many :microposts, dependent: :destroy
has_secure_password
end
数据库中的User表不包含password / password_confirmation字段。它只有一个
password_digest字段。我很困惑,我不应该在表中没有的字段上使用attr_accessor方法吗?我认为代码看起来应该是这样的:
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :nick_name
attr_accessor :password, :password_confirmation
has_many :microposts, dependent: :destroy
has_secure_password
end
因为表列中没有password / password_confirmation,所以需要is'nt attr_accessor吗?我很困惑。
答案 0 :(得分:1)
无需混淆。你是对的,非db支持字段需要attr_accessor
,因为它是该字段的getter / setter。另一方面,Rails使用attr_accessible
来标识允许由请求(也称为白名单)分配哪些属性。根据您的示例,如果您在password
属性中未包含password_confirmation
和attr_accessible
,则无法在请求中批量分配它们。
答案 1 :(得分:1)
阅读source,User
课程不会调用attr_accessor :password
,这是有道理的。宏本身会调用attr_reader :password
,您不需要password_confirmation
访问者。
您还需要考虑User
类实际应该关注的内容。 password
和password_confirmation
与身份验证有关。尽管has_secure_password
最终在User
类中定义了与身份验证相关的方法,但我认为我们不应该关注User
类中特定于身份验证的实现细节。相反,ActiveModel::SecurePassword是。因此,您不应该关注定义password
和password_confirmation
的方法,除非您自己定义的特定功能需要访问这些属性。
很遗憾,attr_accessible
需要允许在控制器中批量分配这些值。但是有一个原因,为什么在Rails 4中这是deprecated。