【发布时间】:2016-12-20 16:50:30
【问题描述】:
让我的用户注册在 Rails 中工作时遇到了一个奇怪的问题。当我创建一个用户时,它会显示它的所有字段,但 password_digest 为零,但是当我输入“u.email”之类的内容时,电子邮件就会显示出来。但是,我认为它不想保存用户,因为它认为它不满足所有验证要求。
一些rails控制台摆弄:
irb(main):003:0> u = User.new({username: "askddkasd", email: "a@a.a",
password: "meowmeowmeow", password_confirmation: "meowmeowmeow"})
=> #<User id: nil, username: nil, email: nil, password_digest:
"$2a$10$eWhQdOCLXfmcGrrRdigSFeENUeAEaQ6xJ7U08k7g3gZ...", salt: nil>
irb(main):002:0> u.save
(0.2ms) BEGIN
User Exists (0.3ms) SELECT 1 AS one FROM `users` WHERE `users`.`username` = BINARY 'askddkasd' LIMIT 1
User Exists (0.2ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY 'a@a.a' LIMIT 1
(0.1ms) ROLLBACK
=> false
irb(main):022:0> u.username
=> "askddkasd"
irb(main):023:0> u.email
=> "a@a.a"
如您所见,这些字段显示为 nil,但我可以访问它们的值。 这是我的用户模型:
class User < ApplicationRecord
has_secure_password
attr_accessor :username, :email, :password, :password_confirmation
validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
validates :email, :presence => true, :uniqueness => true
validates :password, :confirmation => true #password_confirmation attr
validates_length_of :password, :in => 6..20, :on => :create
after_save :clear_password
def password=(password)
self.password_digest = BCrypt::Password.create(password)
end
def is_password?(password)
BCrypt::Password.new(self.password_digest) == password
end
def clear_password
self.password = nil
end
def self.authenticate(username_or_email="", login_password="")
if username_or_email.include? '@'
user = User.find_by_email(username_or_email)
else
user = User.find_by_username(username_or_email)
end
if user && user.is_password?(login_password)
return user
end
return false
end
end
以前有人遇到过这个问题吗?如果是这样,您是如何解决的?
更新:可能是因为我有用户名和电子邮件作为访问者吗?所以这些值实际上并没有到达要存储在数据库中的用户名/电子邮件字段?
【问题讨论】:
-
u.errors中有什么内容? -
#<ActiveModel::Errors:0x007fa075241e50 @base=#<User id: nil, username: nil, email: nil, password_digest: "$2a$10$WH5OUfqx4vYDoeD3nMlhR.rm9F7O6QSIg.Rd9zcu215...", salt: nil>, @messages={:password_confirmation=>["doesn't match Password"], :password=>["is too short (minimum is 6 characters)"]}, @details={:password_confirmation=>[{:error=>:confirmation, :attribute=>"Password"}], :password=>[{:error=>:too_short, :count=>6}]}>
标签: ruby-on-rails ruby model-view-controller login model