[英]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去了。
lib
目录(意味着不自动加载API)。 这意味着必须在API代码更改时重新启动服务器,但解决了问题。 这就是配置这样的宝石的原因 - 因为它们不是自动加载的。 在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.