Rails重装!重置类变量,需要重新运行一些初始化器

时间:2016-11-23 00:00:22

标签: ruby-on-rails ruby ruby-on-rails-5 rails-console

假设我需要解析一些配置以实现一些服务单例(可以与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!期间保留的其他类型的变量 我可以在这里使用吗?

2 个答案:

答案 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/文件夹中