2012-03-01 58 views
1

紅寶石寶石BCrypt有一個如何使用它的模塊之一的例子。從文檔摘自:使用實例變量&self.variable

爲什麼我們會用實例變量@password在所有的時候,我們有self.password_hash屬性?我覺得我錯過了一些東西,可能是因爲我對ruby沒有經驗。就個人而言,我會完成我所相信的是相同的搭配:

def password 
    self.password_hash ||= Password.new(self.password_hash) 
end 

def password=(new_password) 
    self.password_hash = Password.create(new_password) 
end 
+2

我開始回答 - 但後來意識到,你是對的,這有點奇怪。我想我們必須調查周圍的環境才能找出'@ password'和'#password_hash'之間的區別。我認爲你的方法可行,但有時可能會有其他副作用,要求允許這兩種方法有所不同。我唯一可以肯定的是'@ password'總是一個Password實例,但它似乎'#password_hash' _can be_,但不會顯示爲_always將會是__。有沒有一種方法可以調用'#password_hash ='? – Matt 2012-03-01 22:14:18

回答

2

的區別如下:密碼哈希是一個字符串 - 密碼的哈希值。然而Password.new(self.password_hash)創建了Password類的新對象。因此,區別:StringPassword。您可以在Password對象上調用cost,version等方法,這些對象不適用於String

我猜你會發現下面的方法奇怪:

def password=(new_password) 
    @password = Password.create(new_password) 
    self.password_hash = @password 
end 

但什麼這裏發生,這不是明顯的是Password對象String對象在self.password_hash分配轉換 - 在to_s方法返回的哈希的密碼並且該值存儲在數據庫中。更重要的是 - @password實例變量已設置,因此password方法將返回Password類的實例,而不是密碼哈希String

+0

謝謝,這非常有道理。回顧文檔,它確實聲明'self.password_hash'是數據庫中的':string'。 +1 – 2012-03-07 11:20:53