我有一个自定义初始值设定项,可以为某些API客户端设置一堆数据。我有一个实现配置的类。当我运行rails c
时,我看到数据正确存储在配置中。但如果我运行reload!
,配置就会被吹走。
配置/初始化/ rewards.rb
RewardsConfig.configure do |config|
config.register_client(
key: :giftbit,
klass: Rewards::Clients::GiftbitRewardsClient,
client_config: {
address: ENV['GIFTBIT_API_ADDRESS'],
token: ENV['GIFTBIT_API_TOKEN'],
params: {
'marketplace' => {
region: '2',
limit: '1000',
long_format: true
}
}
}
)
end
LIB / rewards_config.rb
module RewardsConfig
def self.configuration
@configuration ||= Configuration.new
end
def self.configure
yield(configuration) if block_given?
end
class Configuration
attr_accessor :clients
def initialize
@clients = {}
end
def register_client(key: nil, klass: nil, client_config: {})
clients[key] ||= {
class: klass,
client_config: client_config
}
end
end
end
当我运行rails c
时,我可以运行RewardsConfig.configuration
并看到Giftbit客户端数据已加载到@clients
实例var中。但是如果我运行reload!
然后运行RewardsConfig.configuration
,我会看到:
=> #<RewardsConfig::Configuration:0x007fcff37db1d8 @clients={}>
。
我有另一个初始化程序,用于在Tangocard gem中设置配置数据,以便与Tangocard API进行通信。当我重新加载Rails控制台时,配置数据仍然存在。
为什么配置数据会在我的课堂上被吹走,这几乎与这个宝石完全一样?
答案 0 :(得分:0)
在Autoloading and Reloading Constants的Rails指南中很好地解释了这个问题。
您可以尝试将RewardsConfig
分配给Constant
变量,然后重新加载对clients
的引用将保留,但您需要记住变量名称,因此这不是最好的方法(试过并为我工作)。
文档的第二个建议是定义接入点,在我看来这是一个更好的选择。