阻止 Rails 在开发模式下卸载模块

发布于 2024-08-25 00:47:43 字数 797 浏览 8 评论 0原文

我的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深陷 2024-09-01 00:47:43

在引用 MyModule 之前的环境文件中,使用 require 加载该文件。

require 'my_module'

这绕过了动态依赖加载机制。

In your environment file before referencing MyModule, use require to load the file.

require 'my_module'

this bypasses the dynamic dependency loading mechanism.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文