阻止 Rails 在开发模式下卸载模块
我的 Rails 应用程序中有一个位于 /lib 中的模块,然后
module MyModule
mattr_accessor :the_variable
class << self
def setup
yield this
end
end
end
我可以从我的 environments/#{RAILS_ENV}.rb
文件中为 the_variable
设置特定于环境的值:
MyModule.setup do |my_module_config|
my_module_config.the_variable = 42
end
这很可爱,而且看起来(几乎)工作得很好。
问题在于,在开发模式下,Rails 通过 ActiveSupport::Dependency 卸载大量模块,并根据新请求及时重新加载它们。这通常是一个很好的行为,因为它意味着您在更改代码时不需要重新启动本地主机服务器。
但是,这也会清除我初始化的 the_variable
变量,并且当下一个请求进入时,初始化程序(显然)不会再次运行。最终效果是后续请求最终将 MyModule.the_variable
设置为 nil
,而不是我正在寻找的 42
。
我正在尝试找出如何停止 Rails 在请求结束时卸载我的模块,或者找到另一种方法来干净地为我的模块提供环境特定的配置。
有什么想法吗? :-/
I have a module in my Rails app that lives in /lib
module MyModule
mattr_accessor :the_variable
class << self
def setup
yield this
end
end
end
From my environments/#{RAILS_ENV}.rb
file I can then set an environment-specific value for the_variable
:
MyModule.setup do |my_module_config|
my_module_config.the_variable = 42
end
This is lovely, and it seems to work (almost) fine.
The problem is that in development mode, Rails via ActiveSupport::Dependencies
unloads a load of modules, and reloads them in time for the new request. This is usually a great behaviour because it means you don't need to restart your localhost server when you make a code change.
However, this also clears out my initialised the_variable
variable, and when the next request comes in the initialiser (obviously) isn't run again. The net effect is that subsequent requests end up having MyModule.the_variable
set to nil
rather than the 42
that I'm looking for.
I'm trying to work out how to stop Rails unloading my module at the end of the request, or alternatively find another way to cleanly provide environment specific configuration for my modules.
Any ideas? :-/
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在引用 MyModule 之前的环境文件中,使用 require 加载该文件。
这绕过了动态依赖加载机制。
In your environment file before referencing MyModule, use require to load the file.
this bypasses the dynamic dependency loading mechanism.