Ruby on rails 轨道重新加载!重置类变量,需要重新运行一些初始值设定项

Ruby on rails 轨道重新加载!重置类变量,需要重新运行一些初始值设定项,ruby-on-rails,ruby,ruby-on-rails-5,rails-console,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/sv

假设我需要解析一些配置来实例化一些服务单例(可以与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控制台上
重启,此@config变量已清除,这是一个问题

有吗

  • 重新加载后可以用来重新运行初始值设定项的钩子
  • 重新启动期间将保留的其他类型的变量
    我可以在这里用吗

您可以将配置方法定义为:

def配置
@config | |=Rails.application.secrets.my|u service.credentials
结束


并调用此方法,而不是
@config
,因此当config变量未设置时,它将再次设置,否则它将返回值。

看到人们仍在阅读此方法,下面是我最终使用的实现

#config/initializers/0_service_activation.rb
#激活在文件末尾完成
模块服务激活
def自检(带重新加载)
ActiveSupport::Reloader.to_prepare do
产量
结束
结束
模块松弛
def自助服务
::松弛接头
结束
def self.u是否应激活?
公用事业生产||
实用工具。登台||
(
公用事业发展&&
环境['ENABLE_SLACK']=='true'
)
结束
def自动激活
松弛=服务
slack.webhook=Rails.application.secrets.slack和.dig(:slack\u webhook)
Rails.application.secrets和.dig(:slack,:intercept_channel)。尝试do|channel|
slack.intercept\u channel=如果存在channel?
结束
放松,激活
松弛的
结束
结束
[
服务激活::内部通信,
ServiceActivation::Slack,
服务激活::谷歌
].每个do |激活剂|
ServiceActivation.with_reload do
如果activator.activate应被激活,则激活activator.activate?
activator.service.status_报告
结束
结束

我没有展示我的连接器类SlackConnector,但基本上你可以从它的调用方式猜出接口。您需要设置webhook url,并执行其他操作。实现是解耦的,因此可以在Rails和Capistrano中使用相同的SlackConnector进行部署,因此它基本上位于
lib/
文件夹中,这是一个老问题,但因为有了新的读取器:重新启动后,等。钩子在ActiveSupport::Reloader from Rails 5中可用。请参阅文档。这里的问题是您将实现与Rails框架耦合。我将初始值设定项(只提供凭证)和服务本身分开,因为服务可以在Rails之外使用,初始值设定项的工作是传递Rails机密。我将把这个添加到我的问题和一个Ruby标记中,这是真的。使用yaml文件而不是机密文件怎么样?您将避免在框架和键之间耦合逻辑。(我觉得你的问题不是很普遍的问题哈哈)