0

我正在关注 Michael Hartls rails tutorial 。这是用户模型类。

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation, :nick_name
  has_many :microposts, dependent: :destroy
  has_secure_password
end

数据库中的用户表不包含密码/密码确认字段。它只有一个

密码摘要
场地。我很困惑,我不应该对表中不存在的字段使用 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

因为表列中不存在密码/密码确认,所以不需要 attr_accessor 吗?我彻底糊涂了。

4

2 回答 2

1

无需混淆。你是对的,attr_accessor非数据库支持的字段是必需的,因为它是该字段的 getter/setter。另一方面,attr_accessibleRails 使用它来识别允许由请求分配哪些属性(又名白名单)。鉴于您的示例,如果您不包含passwordandpassword_confirmationattr_accessible属性中,您将无法在请求中批量分配它们。

于 2013-05-26T04:04:06.027 回答
1

阅读源代码,就会明白为什么User类不调用attr_accessor :password. 宏本身调用attr_reader :password,您不需要password_confirmation访问器。

您还需要考虑User该类实际上应该关注什么。password并且password_confirmation与身份验证有关。尽管has_secure_password最终在User类中定义了与身份验证相关的方法,但我认为我们不应该特别关注User类中身份验证的实现细节。相反ActiveModel::SecurePassword是。因此,您不应该关心定义方法passwordpassword_confirmation除非您自己定义的特定功能需要访问这些属性。

不幸的attr_accessible是,需要允许在控制器中批量分配这些值。但是在 Rails 4中不推荐使用它是有原因的。

于 2013-05-26T04:25:12.703 回答