gpt4 book ai didi

ruby-on-rails - 从实例方法中访问 ActiveSupport::Concern 类方法

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:43 26 4
gpt4 key购买 nike

我正在学习 Michael Hartl 的教程,但发现 User 类变得有点困惑。我想通过将功能 block 拉入单独的 mixins 来稍微清理一下(使用新的 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 实例方法正在尝试访问 encryptnew_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

关于ruby-on-rails - 从实例方法中访问 ActiveSupport::Concern 类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21003077/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com