2016-05-27 2 views
1

В 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? Или он по умолчанию расширяет каждую модель, если соответствующий драгоценный камень включен?

ответ

0
  • Как включить вызов здесь работает внутри метода?

Все ActiveRecord::Base класс имеет метод класса :has_secure_password

$ rails console 
=> ActiveRecord::Base.respond_to? :has_secure_password 
=> true 
  • Как это добавляет методы экземпляра моей модели класса?
  • Как модуль ClassMethods «получает» в моей модели?

С ActiveSupport::Concernмагия.

  • Как-то «расширяется» мой класс, потому что я использовал has_secure_password call?

Нет

  • Или это расширение каждой модели по умолчанию, если соответствующий драгоценный камень включен?

Нет, это просто расширение вашей модели по умолчанию.

+0

Итак, я фактически обнаружил здесь два пункта. 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 для использования. –

+0

3. ActiveModel [spec] (http://guides.rubyonrails.org/active_model_basics.html#securepassword) имеет явный include ActiveModel :: SecurePassword для модели, хотя теперь он не нужен - он включен по умолчанию для каждой модели –

+0

Правильно , «ActiveModel :: SecurePassword» - это «ActiveSupport :: Concern», класс _extend_ и экземпляр класса с некоторыми функциями. –

0

Самый простой способ понять, что что-то делает! В этом случае это будет документация ActiveModel::SecurePassword. От того, вы можете увидеть, что 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 
+0

Да, я даже просмотрел источники SecurePassword module.on github, которые я предоставил. Я не мог понять, как здесь работает «InstanceMethodsOnActivation». Я полагаю, что модуль ClassMethods модуля модуля SecurePassword получает встроенный (расширяющий) мой класс модели (или каждый класс модели?). Поэтому включение вызова работает как вызов класса на моей модели. Таким образом, он включает методы внутри InstanceMethodsOnActivation в мой класс. Поэтому мне нужно только теперь, чтобы метод has_secure_password отображался методом класса моего модуля автоматически. –

+0

Это средство предоставляет ActiveSupport :: Concern – Sunny

 Смежные вопросы

  • Нет связанных вопросов^_^