2013-03-20 33 views
10

私はRails tutorial by Michael Hartlをやっている、と私はあなたが単に追加のポイントに来ている:あなたのモデルクラスにモデルクラスでhas_secure_passwordはどのように機能しますか?

has_secure_password 

と魔法の束が起こります。

私のモデルクラスが拡張するActiveRecord::Baseに含まれているActiveModel::SecurePasswordモジュールからこのメソッドが来ていることを理解しています。

私が理解できないことは、その行をクラス定義に追加するときに起こっていることです。誰かができるだけ詳細に説明してください。私は本当に何が起こっているのか理解したいと思うだけでなく、私のアプリでそれを動作させる方法を知らないものを投げる。

(それは私が混乱している理由を理解するのに役立ちます場合は、私は、Javaの背景から来て、私はルビーに新たなんだ)

+0

私はそれがおそらく、コメントのこの行で十分だと思います。 –

答えて

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宝石をロードしbcryptを必要とします。 bcryptは、Wikipediaで詳しく知ることができる安全なハッシュ関数です。
  2. passwordというモデルに読み取り専用属性を追加します。
  3. パスワードがpassword_confirmationと呼ばれる別のフィールドによって確認されることを検証します。つまり、確認のためにパスワードを2回入力する必要があります。
  4. モデルを保存する前にpassword_digestが存在することを保証します。
  5. この場合はauthenticate(パスワードが正しい場合はtrue、それ以外の場合はfalse)とpassword=がロードされ、渡されたパスワードがpassword_digest属性に暗号化されます。instance methodsをロードします。
  6. このメソッドにデフォルトで保護されている属性がある場合は、保護された属性のリストにもpassword_digestが追加されます。 (従って、質量割り当てられているからそれを防ぐ。)

をあなたがActiveModel::SecurePassword documentationfurther documentation on its instance attributesでより多くを学ぶことができます。

+0

投稿する前にソースを見ました。メソッドの途中で 'require'と' include'が座っているのは混乱しています。私はJavaから来ています。したがって、 'require'を見たときには、Javaのクラス定義の上でのみ構文上有効な 'import'と言います。メソッドの途中にある 'attr_reader'もやや混乱します。私はルビー・コーカンズを通り抜けて、このようなことを何度も覚えていないが、再びそれをかなり速く吹き飛ばした。私はRubyの基本的な何かを見逃しているようだ。あなたは正しい方向に私を向けることができますか? –

+0

Javaとは対照的に、Rubyでは、新しいクラスやメソッドを他のソースから引き出すために、クラス内のどこでも 'require 'することができます。 'attr_reader'はアクセサです:あなたは[ここ](http://www.rubyist.net/~slagell/ruby/accessors.html)(あるいはRubyアクセサリーのGoogleだけ)についてもっと読むことができます。 – Veraticus

+0

はい、アクセサーは、メソッドの途中で宣言されています。クラスのクラス内にあります。アクセサー(リンクを含む)で見たすべての例は、その定義をクラス定義の一部として示しています。私はこのメソッドを呼び出すクラスにどのように関連しているのか分かりません。 –

関連する問題