2015-04-01 24 views
-2

我正在嘗試學習Ruby和RoR。 我被Ruby的魔法:)混淆RoR模型中的獲取者

class User < ActiveRecord::Base 
    require 'digest/sha1' 
    validates :login, :password, :email, { presence: true } 
    validates :login, :email, { uniqueness: true } 

    before_save :hash_password 

    private def hash_password 
     if password_chanched? 
      puts @password.class.name 
      puts password 
      password = 'test_pass' 
      puts password 

      # @password = Digest::SHA1.hexdigest(password)  it works 
     end 
    end 
end 

控制檯:

>> t = User.new login: 'Test', email: '[email protected]', password: 'trololo' 
#<User id: nil, login: "Test", password: "trololo", email: "[email protected]", created_at: nil, updated_at: nil> 

>> t.save 
NilClass 
trololo 
test_pass 
true 

>> t.password 
"trololo" 

所以我的問題是:

什麼密碼回報?我有什麼修改回調?

其實,這before_validation回調只是正常:

def downcase_login_and_email 
    login.downcase! 
    email.downcase! 
end 
+0

不知道我理解的問題,是U詢問'password'或回調? – 2015-04-01 19:35:11

+0

Both :) 對不起我的英語。 – Nondv 2015-04-02 08:12:11

回答

0

我想,當我寫

密碼= 'test_pass'

我不使用的setter (如any_instance.password ='test_pass'),但我創建了一個局部變量password這對類實例沒有任何意義。

我不得不使用自我

if password_changed? 
     puts password # trololo 
     self.password = 'test_pass' 
     puts password # test_pass 
    end 

所以我要了解更多關於Ruby :)