2010-03-25 9 views
1

Curieux de savoir comment procéder pour appeler une méthode de classe à partir d'une méthode d'instance d'un module inclus par une classe d'enregistrement active. Par exemple, je souhaite que les modèles utilisateur et client partagent les éléments de chiffrement du mot de passe.appelle une méthode de classe à partir d'une méthode d'instance à partir d'un module mixin (rails)

# 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 

Cependant, cela échoue. Dit que la méthode de classe ne peut pas être trouvée lorsque la méthode d'instance l'appelle. Je peux appeler User.encrypt_password ('mot de passe') mais User.authenticate ('mot de passe') ne parvient pas à rechercher la méthode utilisateur # encrypt_password

Toute pensée?

Répondre

1

Vous devez la encrypt_password comme une méthode de classe

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