2016-05-27 8 views
1

Rails(4.2.6)では、gemfileにgem 'bcrypt'を含めてインストールし、モデルクラスに 'has_secure_password'という行を追加するだけです。モデル内に「has_secure_password」という単一行を持つだけで、モデルモデルにメソッドを追加する方法は?

私のモデルクラスにメソッドを追加するという点で、どのように機能するのだろうか。

私はgithubの上SecurePasswordのソースに探していた場合 - https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/activemodel/lib/active_model/secure_password.rb 私は次の行を参照してください

module ActiveModel 
    module SecurePassword 
    extend ActiveSupport::Concern 
     module ClassMethods 
     def has_secure_password(options = {}) 
     ... 
      include InstanceMethodsOnActivation 
     ... 
     end 
     .. 

module InstanceMethodsOnActivation 
    def authenticate(unencrypted_password) 
.... 

どのようにコールがメソッドの内部で、ここで働きなどが?私のモデルクラスにインスタンスメソッドを追加する方法は? ClassMethodsモジュールは私のモデルでどのように「取得」されますか?

私はhas_secure_password呼び出しを使用しているので、何とか私のクラスを拡張していますか?対応するgemがオンになっている場合は、デフォルトで各モデルを拡張しますか?

答えて

0
  • :それから、あなたはそのhas_secure_passwordがこれを行う見ることができますか?

すべてActiveRecord::Baseクラスは、クラスメソッド、それは私のモデルクラスにインスタンスメソッドを追加する方法:has_secure_password

$ rails console 
=> ActiveRecord::Base.respond_to? :has_secure_password 
=> true 
  • を持っていますか?
  • ClassMethodsモジュールは私のモデルでどのように「取得」されますか?

ActiveSupport::Concern魔法

  • has_secure_password コールを使用しているので、何とか私のクラスを拡張していますか?

  • または対応する宝石が オンになっている場合には、デフォルトでは、各モデルを拡張しますか?

いいえ、デフォルトでモデルを拡張しています。

+0

Ok、私は実際にここで2点を発見しました。 1 - ActiveRecord [base](https://github.com/rails/rails/blob/a26a3a075637215c9028308436ca89cba8da2ed5/activerecord/lib/active_record/base。rb#L310)クラスには、デフォルトでActiveModel :: SecurePasswordが含まれています。だから実際にhas_secure_passwordコールは、gemが含まれていても、デフォルトでActiveRecordモデルで利用できます。 2.このメソッド(has_secure_password)を呼び出すと、InstanceMethodsOnActivation呼び出しが含まれているため、モデルごとにインスタンスメソッドが追加されます。それは、bcrypt gemが使用されることを必要とし、したがって検証します。 –

+0

3. ActiveModel [spec](http://guides.rubyonrails.org/active_model_basics.html#securepassword)にはモデルにActiveModel :: SecurePasswordが明示的に含まれていますが、現在は不要ですが、モデルごとにデフォルトで組み込まれています –

+0

そうです。 'ActiveModel :: SecurePassword'は_extend_クラスといくつかの機能を持つクラスのインスタンスである' ActiveSupport :: Concern'です。 –

0

何がしているのかを理解する最も簡単な方法です!この場合、それは文書ActiveModel::SecurePasswordとなります。呼び出しはメソッド内で、ここでどのように動作するが含ま

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 
+0

まあ、私はSecurePassword module.on githubのソースを調べましたが、これは私が提供したものです。私はここで "InstanceMethodsOnActivationをインクルードする"方法を理解できませんでした。私はモジュールSecurePassword内のモジュールClassMethodsが私のモデルクラス(または各モデルクラス?)を埋め込まれている(拡張されている)と想像します。したがって、私のモデルでは、クラス呼び出しのような呼び出しの動作が含まれます。したがって、私のクラスへのInstanceMethodsOnActivation内のメソッドが含まれています。ですから、私のモジュールのクラスメソッドによって自動的にhas_secure_passwordがどのように現れているのかが分かります。 –

+0

この施設はActiveSupport :: Concernによって提供されます – Sunny

関連する問題