2016-08-14 49 views
0

我遇到一個讓我的用戶註冊在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 

有沒有人有這個問題?如果是這樣,你是如何解決它的?

更新:難道是因爲我有用戶名和電子郵件作爲訪問者?所以這些值實際上不會到用戶名/電子郵件字段存儲在數據庫中?

+0

'u.errors'中有什麼? – user1201917

+0

'#, @messages = {:password_confirmation => [「不符合密碼」],:密碼=> [「太短(最少6個字符)」],@details = {:password_confirmation => [{:error = >:確認,:屬性=>「密碼」}],:密碼=> [{:error =>:too_short,:count => 6}]}>' –

回答

0

,它推出這一語句後回日誌

User Exists (0.2ms) SELECT 1 AS one FROM `users` WHERE `users`.`email` = BINARY '[email protected]' LIMIT 1 

讓我覺得,已經有與此電子郵件地址數據庫中的用戶中的事實。您可以通過致電u.valid?,然後u.errors來確定問題所在。

+0

users表中有0個條目。 –