Ruby on rails 从模块mixin(rails)的实例方法内部调用类方法

Ruby on rails 从模块mixin(rails)的实例方法内部调用类方法,ruby-on-rails,module,mixins,Ruby On Rails,Module,Mixins,好奇的是,如何从活动记录类包含的模块的实例方法内部调用类方法。例如,我希望用户和客户机模型共享密码加密的细节 # 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

好奇的是,如何从活动记录类包含的模块的实例方法内部调用类方法。例如,我希望用户和客户机模型共享密码加密的细节

# 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\u密码(“密码”) 但是 User.authenticate(“密码”)无法查找方法User#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 

您需要像类方法一样加密\u密码

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