重新加载rails控制台会破坏自定义配置

时间:2016-12-08 20:24:15

标签: ruby-on-rails ruby-on-rails-4

我有一个自定义初始值设定项,可以为某些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控制台时,配置数据仍然存在。

为什么配置数据会在我的课堂上被吹走,这几乎与这个宝石完全一样?

1 个答案:

答案 0 :(得分:0)

Autoloading and Reloading Constants的Rails指南中很好地解释了这个问题。

您可以尝试将RewardsConfig分配给Constant变量,然后重新加载对clients的引用将保留,但您需要记住变量名称,因此这不是最好的方法(试过并为我工作)。

文档的第二个建议是定义接入点,在我看来这是一个更好的选择。