Ruby on rails 每个请求都会重新加载模块,因此初始化的数据会丢失

Ruby on rails 每个请求都会重新加载模块,因此初始化的数据会丢失,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我将值存储在模块内部的类变量中,例如: module TranslationEnhancer def self.install! klass @dictionaries ||= [] << klass end ... end TranslationEnhancer.install! EnglishDirectory, FrenchDirectory 现在,如果我在开发环境中启动服务器,在第一个请求期间一切都正常。然而,在那个请求之后,@字典突然变成了零。我已经

我将值存储在模块内部的类变量中,例如:

module TranslationEnhancer
  def self.install! klass
    @dictionaries ||= [] << klass
  end
  ...
end
TranslationEnhancer.install! EnglishDirectory, FrenchDirectory
现在,如果我在开发环境中启动服务器,在第一个请求期间一切都正常。然而,在那个请求之后,@字典突然变成了零。我已经对TranslationEnhancer中的所有其他代码进行了注释,所以我绝对确信每次我执行请求时都必须重新加载整个模块

我尝试将模块移动到lib目录之外(将其移动到lib_unloadable),然后尝试:

ActiveSupport::Dependencies.explicitly_unloadable_constants << "TranslationEnhancer" 
这些值在运行时不会更改,它们只会在不同的项目之间更改。

@dictionaries不是“类变量”。它是一个“类级实例变量”。 请查看此处以获得更好的解释:

尝试改用@字典。

解决了


我意识到整个application.rb和environment.rb文件与所有其他文件一起被重新加载。唯一不会重新加载的是初始化器(config/initializers/*)。解决方案是将初始化移到application.rb。

这是一个功能,而不是一个bug:-)无法抵抗,很抱歉。为什么不在初始化器中定义一个常量,这样就可以在应用程序中按名称访问它呢?您是否需要在应用程序的生命周期内更改该值?您可以将常量定义为散列,并在需要时更改其内容值(仍在寻找更好的解决方案)。您所说的
是什么意思我将值存储在模块内部的类变量中
。模块混入了吗?或者它是一个模块变量?它是一个模块变量。该值在应用程序的生命周期内不会更改,但该模块是一个库,因此我必须从外部为其提供值,以便其保持独立性和可重用性。我不能从自动重新加载的模块列表中删除此模块吗?有类似的吗?有趣的文章,谢谢澄清。不幸的是,这与问题无关。每一个请求都会重新加载所有内容,包括类级实例变量和类变量:(啊,这太奇怪了。我知道Rails有重新加载模型的功能,以便在运行中更轻松/动态地更改代码(无需重新启动服务器)。有一个environment/config选项可以启用此功能。也许您可以在开发过程中通过关闭此选项来测试此功能。这意味着您必须在每次更改代码时重新启动…但这可能是您可以接受的。“config.cache_classes=false”不确定是否有帮助-但可能值得一试?
TranslationEnhancer.install! EnglishDirectory, FrenchDirectory