我遇到一個讓我的用戶註冊在Rails中工作的奇怪問題。當我創建一個用戶時,它會顯示所有的字段,但password_digest爲零,但是當我輸入「u.email」之類的東西時,電子郵件會顯示出來。但是,它不想保存用戶,我假定它是因爲它認爲它不符合所有驗證要求。Ruby on Rails - 顯示無字段的用戶對象(即使它們已填充)
一些軌控制檯擺弄:
irb(main):003:0> u = User.new({username: "askddkasd", email: "[email protected]",
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 '[email protected]' LIMIT 1
(0.1ms) ROLLBACK
=> false
irb(main):022:0> u.username
=> "askddkasd"
irb(main):023:0> u.email
=> "[email protected]"
正如你所看到的,字段顯示爲零,但我可以訪問它們的值。 這裏是我的用戶模型:
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'中有什麼? – user1201917
'#, @messages = {:password_confirmation => [「不符合密碼」],:密碼=> [「太短(最少6個字符)」],@details = {:password_confirmation => [{:error = >:確認,:屬性=>「密碼」}],:密碼=> [{:error =>:too_short,:count => 6}]}>' –