В Rails (4.2.6) Я могу включить gem 'bcrypt' в Gemfile, установить его, а затем просто добавить строку 'has_secure_password' в моем классе модели.Как ActiveModel в Rails добавляет методы для моделирования класса, просто имея одну строку «has_secure_password» в модели?
Интересно, как это работает с точки зрения добавления методов в класс модели.
Если я смотрю в источник SecurePassword на GitHub - 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 call? Или он по умолчанию расширяет каждую модель, если соответствующий драгоценный камень включен?
Итак, я фактически обнаружил здесь два пункта. 1 - ActiveRecord [base] (https://github.com/rails/rails/blob/a26a3a075637215c9028308436ca89cba8da2ed5/activerecord/lib/active_record/base.rb # L310) по умолчанию включает ActiveModel :: SecurePassword. Таким образом, действительно, вызов has_secure_password доступен для любой модели ActiveRecord по умолчанию независимо от того, включен ли gem. 2. Вызов этого метода (has_secure_password) добавит методы экземпляра к модели из-за включения вызова InstanceMethodsOnActivation. Он требует и, следовательно, проверяет жемчужину bcrypt для использования. –
3. ActiveModel [spec] (http://guides.rubyonrails.org/active_model_basics.html#securepassword) имеет явный include ActiveModel :: SecurePassword для модели, хотя теперь он не нужен - он включен по умолчанию для каждой модели –
Правильно , «ActiveModel :: SecurePassword» - это «ActiveSupport :: Concern», класс _extend_ и экземпляр класса с некоторыми функциями. –