假设我需要解析一些配置以实现一些服务单例(可以与Rails一起使用或不与Rails一起使用)。
示例代码示例:
#services/my_service.rb
module MyService
@config = nil
def self.load_config(config)
@config = config
end
当使用Rail(或Capistrano,SInatra等)时,我会使用初始化程序来启动服务
#initializers/svc.rb
MyService.load_config(Rails.application.secrets.my_service.credentials)
但是当专门用于Rails时,在每个rails控制台restart!
上,这个@config变量被清除,这是一个问题......
有吗
after-reload!
我可以用来重新运行初始化程序的钩子吗?restart!
期间保留的其他类型的变量
我可以在这里使用吗?答案 0 :(得分:0)
您可以将config方法定义为:
def config
@config ||= Rails.application.secrets.my_service.credentials
end
并且调用此方法而不是@config
,因此当取消设置config变量时,它将再次设置,否则它将返回值。
答案 1 :(得分:0)
看到人们仍然在读这篇文章,这是我最终得到的实现
# config/initializers/0_service_activation.rb
# Activation done at the end of file
module ServiceActivation
def self.with_reload
ActiveSupport::Reloader.to_prepare do
yield
end
end
module Slack
def self.service
::SlackConnector
end
def self.should_be_activated?
Utility.production? ||
Utility.staging? ||
(
Utility.development? &&
ENV['ENABLE_SLACK'] == 'true'
)
end
def self.activate
slack = service
slack.webhook = Rails.application.secrets.slack&.dig(:slack_webhooks)
Rails.application.secrets&.dig(:slack, :intercept_channel).try do |channel|
slack.intercept_channel = channel if channel.present?
end
slack.activate
slack
end
end
[
ServiceActivation::Intercom,
ServiceActivation::Slack,
ServiceActivation::Google
] .each do |activator|
ServiceActivation.with_reload do
activator.activate if activator.should_be_activated?
activator.service.status_report
end
end
我没有显示连接器类SlackConnector
,但是基本上您可以从调用接口的方式猜测它。您需要设置webhook网址,并执行其他操作。实现是分离的,因此可以在Rails和Capistrano中使用相同的SlackConnector进行部署,因此它基本上在lib/
文件夹中