我可以在rails中的非数据库支持字段上使用attr_accessible吗?

时间:2013-05-26 03:54:03

标签: ruby-on-rails ruby-on-rails-3.2

我正在关注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吗?我很困惑。

2 个答案:

答案 0 :(得分:1)

无需混淆。你是对的,非db支持字段需要attr_accessor,因为它是该字段的getter / setter。另一方面,Rails使用attr_accessible来标识允许由请求(也称为白名单)分配哪些属性。根据您的示例,如果您在password属性中未包含password_confirmationattr_accessible,则无法在请求中批量分配它们。

答案 1 :(得分:1)

阅读sourceUser课程不会调用attr_accessor :password,这是有道理的。宏本身会调用attr_reader :password,您不需要password_confirmation访问者。

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

很遗憾,attr_accessible需要允许在控制器中批量分配这些值。但是有一个原因,为什么在Rails 4中这是deprecated