繁体   English   中英

Ruby on Rails:在开发中的初始化程序中配置API

[英]Ruby on Rails: Configure API in initializer in development

我有一个带有lib的API的Ruby on Rails应用程序。 lib中的文件是自动加载的,API在初始化程序中配置。

# lib/my_api.rb
module MyApi
  extend Configuration
end

# lib/my_api/configuration.rb
module MyApi
  module Configuration
    attr_accessor :my_setting
    def configure
      yield self
    end
  end
end

# config/initializers/my_api.rb
MyApi.configure do |config|
  config.my_setting = 'foo'
end

这适用于生产,但在开发中,API在服务器启动时进行配置。 更改一些代码后,配置丢失并且有错误,因为设置为nil

irb(main):001:0> MyApi.my_setting
=> "foo"
irb(main):002:0> reload!
Reloading...
=> true
irb(main):003:0> MyApi.my_setting
=> nil

我的猜测是,在开发中,类被重新加载,但初始化程序不是,这意味着它只在启动服务器后才配置一次。

现在我在lib/my_api.rb复制我的配置,但这非常hacky。

什么是这个问题的干净解决方案?

module MyApi
  module Configuration
    mattr_accessor :my_setting
    def configure
      yield self
    end
  end
end

mattr_accessor是一个用于创建模块级访问器的ActiveSupport宏。

好吧,在有人提出更好的解决方案之前,我已经提出了两个解决方法。 我跟2去了。

  1. 不要自动加载lib目录(意味着不自动加载API)。 这意味着必须在API代码更改时重新启动服务器,但解决了问题。 这就是配置这样的宝石的原因 - 因为它们不是自动加载的。
  2. lib/my_api.rb末尾手动重新加载开发中的初始化lib/my_api.rb

    load Rails.root.join('config/initializers/smart_meter.rb') if Rails.env.development?

当Rails自动加载类时, MyApi常量将被新的替换。 配置仍可在旧对象上使用:

Loading development environment (Rails 4.2.0)
irb: warn: can't alias context from irb_context.
irb(main):001:0> MyApi.my_setting
=> "foo"
irb(main):002:0> OldMyApi = MyApi
=> MyApi
irb(main):003:0> reload!
Reloading...
=> true
irb(main):004:0> MyApi.my_setting
=> nil
irb(main):005:0> OldMyApi.my_setting
=> "foo"
irb(main):006:0> load Rails.root.join('config/initializers/smart_meter.rb')
=> true
irb(main):007:0> MyApi.my_setting
=> "foo"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM