Rails控制台忽略使用attr_accessor设置的属性,has_secure_password导致密码和password_confirmation被忽略

时间:2015-06-10 06:50:24

标签: ruby-on-rails ruby-on-rails-4.2

用户模型:

class User < ActiveRecord::Base

attr_accessor :name, :email
has_secure_password
validates :password, presence: true, length: { minimum: 6 }

end

问题是,在Rails控制台中, 名称,电子邮件,密码,密码_确认 属性不会显示。

我怀疑前两个是由于设置attr_accessor :name, :email导致的,后两个是由于has_secure_password

但是,当我单独调用这些属性时,它们会出现:

Loading development environment (Rails 4.2.0)
2.2.1 :001 > u = User.new(name: "asd", email: "aedede@aece.com", password: "qweasd", password_confirmation: "qweasd")
 => #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: "$2a$10$a98/zxfH0zaT0Hh.xalVPOxwbJiXAkH17BiRg.sV4hw..."> 
2.2.1 :002 > u
 => #<User id: nil, name: nil, email: nil, created_at: nil, updated_at: nil, password_digest: "$2a$10$a98/zxfH0zaT0Hh.xalVPOxwbJiXAkH17BiRg.sV4hw..."> 
2.2.1 :003 > u.name
 => "asd" 
2.2.1 :004 > u.email
 => "aedede@aece.com" 
2.2.1 :005 > u.password
 => "qweasd" 
2.2.1 :009 > u.save
(0.2ms)  begin transaction
  User Exists (0.2ms)  SELECT  1 AS one FROM "users" WHERE LOWER("users"."email") = LOWER('aedede@aece.com') LIMIT 1
  SQL (0.4ms)  INSERT INTO "users" ("password_digest", "created_at", "updated_at") VALUES (?, ?, ?)  [["password_digest", "$2a$10$a98/zxfH0zaT0Hh.xalVPOxwbJiXAkH17BiRg.sV4hwFXp2jUiTnm"], ["created_at", "2015-06-10 02:42:22.437148"], ["updated_at", "2015-06-10 02:42:22.437148"]]
   (130.8ms)  commit transaction
 => true 
2.2.1 :010 > u
 => #<User id: 3, name: nil, email: nil, created_at: "2015-06-10 02:42:22", updated_at: "2015-06-10 02:42:22", password_digest: "$2a$10$a98/zxfH0zaT0Hh.xalVPOxwbJiXAkH17BiRg.sV4hw..."> 
2.2.1 :011 > u.name
 => "asd"

我已经彻底检查了所有内容,无法找到引起这种情况的因素,对于实际发生的事情的任何见解都将深受赞赏。

1 个答案:

答案 0 :(得分:-1)

password不是数据库users中的列,也不是它的列。这只是一个属性。如果您使用过has_secure_password,那么Rails将自动获取您指定的password,对其进行加密,并在数据库中存储password_digest。数据库中没有password列。

在Rails 4.2中,您不需要在模型中使用列名写attr_accessor。如果您已在迁移中定义它们,Rails将自动创建getter / setter以及一系列其他帮助方法。因此,模型User在Rails 4.2中应如下所示:

class User < ActiveRecord::Base

  has_secure_password
  validates :password, presence: true, length: { minimum: 6 }
end