Oh no ...
是否可以在 payload 加一个字段,放与密码相关的哈希,当用户重置密码后,之前的 token 就失效了。也不需要持久化 token。
我觉得也可行,简单的想法是在 setter 写入值的时候,按照前面设置的 @sign 实例变量的值存成不同名的实例变量,比如 @foo_1 和 @foo_2,分别是 sign 1 和 2 的配置值。大概这样:
config_class = Class.new do
attrs.each do |attr|
define_method attr do
attr.eql?(:sign) ? @sign : instance_variable_get("@#{attr}_#{@sign}")
end
define_method "#{attr}=" do |val|
attr.eql?(:sign) ? (@sign = val) : instance_variable_set("@#{attr}_#{@sign}", val)
end
end
配置的时候就可以:
config.sign = '1'
config.foo = 'foo1'
config.bar = 'bar1'
config.sign = '2'
config.foo = 'foo2'
config.bar = 'bar2'
使用:
MyConfig.config.sign = '1'
MyConfig.config.foo # => 'foo1'
手写的这一段,还没试过,可以参考一下 ... 不过我是觉得上面的 MyConfig.config_a
的用法更好,读某一套配置只需要一行。
再多写一点,可以继续把 sign 方法的名字可配置化,而不是硬编码。
这不都是同名的 key 吗,不知道你的 yml 文件是怎么配置?
「多套配置」是指:Cls.config_a.foo; Cls.config_b.foo
?如果是这个意思,那么我粗糙地实现了一下:
# configurable.rb
module Configurable
module Enable
cattr_accessor :current_config
def method_missing(method, *args)
cattr_accessor method
define_singleton_method method do
self.current_config = method
config = instance_variable_get("@#{current_config}_config")
config.nil? ? self : config
end
send method
end
end
def self.with(*attrs)
# 使用配置属性定义匿名类
config_class = Class.new do
attr_accessor *attrs
end
# 为可混入的类方法定义匿名模块
class_methods = Module.new do
define_method :config do
config_var = "@#{current_config}_config"
instance_variable_set(config_var, config_class.new) if instance_variable_get(config_var).nil?
instance_variable_get(config_var)
end
def configure
yield config
end
end
# 创建并返回新的模块
Module.new do
singleton_class.send :define_method, :included do |host_class|
host_class.extend class_methods
end
end
end
end
# my_config.rb
class MyConfig
extend Configurable::Enable
include Configurable.with :foo
end
# Usage
MyConfig.config_a.configure do |config|
config.foo = 'bar'
end
MyConfig.config_b.configure do |config|
config.foo = 'foo'
end
puts MyConfig.config_a.foo
puts MyConfig.config_b.foo