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がオンになっている場合は、デフォルトで各モデルを拡張しますか?
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が使用されることを必要とし、したがって検証します。 –
3. ActiveModel [spec](http://guides.rubyonrails.org/active_model_basics.html#securepassword)にはモデルにActiveModel :: SecurePasswordが明示的に含まれていますが、現在は不要ですが、モデルごとにデフォルトで組み込まれています –
そうです。 'ActiveModel :: SecurePassword'は_extend_クラスといくつかの機能を持つクラスのインスタンスである' ActiveSupport :: Concern'です。 –