вызов метода класса изнутри метода экземпляра из модуля mixin (rails) - PullRequest
1 голос
/ 25 марта 2010

Любопытно, как можно было бы вызвать метод класса изнутри метода экземпляра модуля, который включен в активный класс записи. Например, я хочу, чтобы как пользовательские, так и клиентские модели разделяли основные принципы шифрования паролей.

# app/models
class User < ActiveRecord::Base
  include Encrypt
end
class Client < ActiveRecord::Base
  include Encrypt
end

# app/models/shared/encrypt.rb
module Encrypt
  def authenticate
    # I want to call the ClassMethods#encrypt_password method when @user.authenticate is run 
    self.password_crypted == self.encrypt_password(self.password) 
  end
  def self.included(base)
    base.extend ClassMethods
  end  
  module ClassMethods
    def encrypt_password(password)
     Digest::SHA1.hexdigest(password)
    end
  end
end  

Однако это не удалось. Говорит, что метод класса не может быть найден, когда метод экземпляра вызывает его. я могу позвонить User.encrypt_password ( 'пароль') но User.authenticate ('password') не может найти метод User # encrypt_password

Есть мысли?

1 Ответ

1 голос
/ 27 марта 2010

Вам нужно encrypt_password как метод класса

module Encrypt
  def authenticate
    # I want to call the ClassMethods#encrypt_password method when @user.authenticate is run 
    self.password_crypted == self.class.encrypt_password(self.password) 
  end
  def self.included(base)
    base.extend ClassMethods
  end  
  module ClassMethods
    def encrypt_password(password)
     Digest::SHA1.hexdigest(password)
    end
  end
end 
...