2013-03-20 20 views
10

我做的Rails tutorial by Michael Hartl,和我來的地步,你只需添加:has_secure_password在我的模型類中如何工作?

has_secure_password 

你的模型類和一堆魔法發生。

據我所知,這種方法來自ActiveModel::SecurePassword模塊,該模塊包含在我的模型類擴展的ActiveRecord::Base中。

我不明白的是什麼,當我去添加這一行到我的類定義。有人可以請儘可能詳細地解釋。我真的很想知道發生了什麼,而不是僅僅在我的應用程序中拋出東西,而不知道它是如何工作的。

(如果它有助於理解爲什麼我很困惑,我來自一個Java的背景,我是新來的Ruby)

+0

我認爲這可能足以這一行註釋的,鄉親們。 – 2013-03-20 05:35:58

回答

8

的理解最簡單的方法是什麼什麼的做的是諮詢的源泉!在這種情況下,那將是ActiveModel::SecurePassword documentation。從這一點,你可以看到has_secure_password做到這一點:

def has_secure_password 
    # Load bcrypt-ruby only when has_secure_password is used. 
    # This is to avoid ActiveModel (and by extension the entire framework) being dependent on a binary library. 
    gem 'bcrypt-ruby', '~> 3.0.0' 
    require 'bcrypt' 

    attr_reader :password 

    validates_confirmation_of :password 
    validates_presence_of  :password_digest 

    include InstanceMethodsOnActivation 

    if respond_to?(:attributes_protected_by_default) 
    def self.attributes_protected_by_default 
     super + ['password_digest'] 
    end 
    end 
end 

以英語解釋,這個功能:

  1. 加載bcrypt-ruby寶石,需要bcryptbcrypt是一個安全的哈希函數,您可以在維基百科中瞭解更多信息。
  2. 添加只讀屬性稱爲password模型。
  3. 將驗證密碼是由另一場證實,被稱爲password_confirmation。換句話說,您必須輸入密碼兩次才能確認。
  4. 確保password_digest存在一個模型保存之前。
  5. 加載instance methods,在本例中爲authenticate(如果密碼正確,則返回true,否則爲false)和password=,它將傳遞的密碼加密到password_digest屬性中。
  6. 如果方法有默認的保護屬性,這也將增加password_digest受保護的屬性該列表。 (因此防止它被批量分配。)

您可以在ActiveModel::SecurePassword documentationfurther documentation on its instance attributes瞭解更多信息。

+0

我在發佈之前查看了源代碼。令我困惑的是,在請求方法中間,「require」和「include」正好坐在一起。我來自Java,所以當我看到'require'時,我的腦海裏就說'import',它在Java中只在語法上有效。坐在方法中間的'attr_reader'也有點混亂。我經歷了Ruby Koans,不記得遇到過這樣的事情,但是我又一次以很快的速度吹響了它。我似乎在這裏錯過了一些基本的Ruby。你能爲我指出正確的方向嗎? – 2013-03-20 04:08:44

+0

與Java相反,在Ruby中,您可以在類中的任何位置「需要」從其他來源獲取新的類和方法。 'attr_reader'是一個訪問器:你可以在這裏閱讀更多關於它們的信息(http://www.rubyist.net/~slagell/ruby/accessors.html)(或者只是谷歌的Ruby訪問器)。 – Veraticus 2013-03-20 04:13:15

+0

是的,但訪問器是在方法中間聲明的,在我的類包含的模塊內部。我在訪問器(包括鏈接)上看到的每個示例都將它們的用法顯示爲類定義的一部分。我不確定它與我調用此方法的類的關係如何。 – 2013-03-20 04:23:47

相關問題