2016-11-23 11 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文件而不是祕密文件怎麼樣?您將避免耦合框架和密鑰之間的邏輯。 (我認爲你的問題不是一個很常見的問題哈哈) –