В методе класса модуля возможно ли получить класс, который смешан в этом модуле? - PullRequest
1 голос
/ 16 марта 2012

У меня есть модуль A, и есть несколько классов, которые необходимо смешать, есть метод, который должен быть записан как метод класса этого модуля, но этот метод должен получать данные из таблиц, которые соответствуют этим классам. Это что реализуемо?

module Authenticate
  def password=(password)
    if password.present?
      generate_salt
      self.hashed_password = Authenticate.encrypt_password(password, salt)
    end
  end

  class << self
    def encrypt_password(password,salt)
      Digest::SHA2.hexdigest(password + salt)
    end
  end

  private
  def generate_salt
    self.salt = self.object_id.to_s + rand.to_s
  end

end


require 'authenticate_module'
class Administrator < ActiveRecord::Base
  validates :password, :confirmation => true
  attr_accessor :password_confirmation
  attr_reader :password
  include Authenticate
end

Это тот метод:

def authenticate(name,password)
  if user = ???.find_by_name(name)
    if user.hashed_password == Authenticate.encrypt_password(password,user.salt)
      user
    end
  end
end

1 Ответ

1 голос
/ 17 марта 2012

Используйте ActiveSupport :: Concern, чтобы добавить методы класса к каждому классу, который включает в себя ваш модуль, затем вызов self для этого метода вернет имя класса.

Это будет что-то вроде:

module Authenticate
  extend ActiveSupport::Concern

  module ClassMethods
    def authenticate(name, password)
      self.class # returns the name of the class that includes this module 
    end
  end
end


class User
  include Authenticate
end


# Now You can call
User.authenticate(name, password)

Что делает ActiveSupport :: Concern, так это то, что всякий раз, когда класс включает модуль, он расширяет этот класс с помощью ClassMethods, что здесь эквивалентно

class User
  include Authenticate
  extend Authenticate::ClassMethods
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...