2016-11-23 10 views
1

假设我需要解析一些配置来实例化一些服务单例(可以使用或不使用Rails)。Rails重载!重置类变量,需要重新运行一些初始化程序

样品代码例如:

#services/my_service.rb 
module MyService 
    @config = nil 

    def self.load_config(config) 
     @config = config 
    end 

当与铁(或Capistrano的,屈,等等),使用我会用一个初始化启动本服务

#initializers/svc.rb 
MyService.load_config(Rails.application.secrets.my_service.credentials) 

但是具体使用时与轨道,在每个轨道控制台restart!,这个@config变量被清除,这是一个问题...

有没有

  • after-reload!钩子,我可以用来重新运行初始化程序?
  • 在我可以在这里使用的restart! 期间将保留的其他类型的变量?
+0

这是一个古老的问题,但由于有新的读者:重启后等钩子可在Rails 5的ActiveSupport :: Reloader中使用。请参阅文档http://www.rubydoc.info/gems/activesupport/ ActiveSupport/Reloader –

回答

0

您可以定义配置方法为:

def config @config ||= Rails.application.secrets.my_service.credentials end

而且调用此方法,而不是@config,所以当配置变量未设置,它将被重新设置,否则将返回值。

+0

这里的问题是你将实现和Rails框架结合在一起。我分成了一个初始化程序(只提供证书)和服务本身,因为服务可以在Rails之外使用,并且初始化程序的工作是传递Rails机密。我将这个添加到我的问题和一个红宝石标签 –

+0

这是真的。使用yaml文件而不是秘密文件怎么样?您将避免耦合框架和密钥之间的逻辑。 (我认为你的问题不是一个很常见的问题哈哈) –