ruby-on-rails – 从实例方法中访问ActiveSupport :: Concern类
发布时间:2020-12-17 03:06:25 所属栏目:百科 来源:网络整理
导读:我正在通过Michael Hartl的教程,但发现User类变得有点杂乱.我想通过将大块功能拉入单独的mixins(使用new-ish ActiveSupport :: Concern,与旧的self.included(klass)模式相比)来清理它. 我在Session部分遇到了一些麻烦. 来自’models / user / session_manage
我正在通过Michael Hartl的教程,但发现User类变得有点杂乱.我想通过将大块功能拉入单独的mixins(使用new-ish ActiveSupport :: Concern,与旧的self.included(klass)模式相比)来清理它.
我在Session部分遇到了一些麻烦. 来自’models / user / session_management.rb’: require 'active_support/concern' module SessionManagement extend ActiveSupport::Concern included do before_create :create_remember_token end private def create_remember_token self.remember_token = self.encrypt(self.new_remember_token) end module ClassMethods def new_remember_token SecureRandom.urlsafe_base64 end def encrypt(token) Digest::SHA1.hexdigest(token.to_s) end end end 我在’models / user.rb’中包含哪些内容: require 'user/authentication' require 'user/session_management' class User < ActiveRecord::Base ... include Authentication include SessionManagement ... end 这适用于身份验证模块(实际上只是验证和has_secure_password).但是,create_remember_token实例方法试图访问encrypt和new_remember_token类方法. NoMethodError: undefined method `new_remember_token' for #<User:0x007f8e17e338f0> # ./app/models/user/session_management.rb:13:in 'create_remember_token' # ./spec/models/user_spec.rb:152:in `block (4 levels) in <top (required)> 我觉得我错过了一些明显的东西.任何见解将不胜感激.提前致谢! 解决方法
这两个方法是类方法,您在实例上调用它们.尝试:
def create_remember_token self.remember_token = self.class.encrypt(self.class.new_remember_token) end 或(首选)将它们移出ClassMethods模块. require 'active_support/concern' module SessionManagement extend ActiveSupport::Concern included do before_create :create_remember_token end private def create_remember_token self.remember_token = encrypt(new_remember_token) end def new_remember_token SecureRandom.urlsafe_base64 end def encrypt(token) Digest::SHA1.hexdigest(token.to_s) end end (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |