每次请求都会重新加载模块,因此初始化数据会丢失

时间:2011-07-29 19:40:58

标签: ruby-on-rails ruby ruby-on-rails-3

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

module TranslationEnhancer
  def self.install! klass
    @dictionaries ||= [] << klass
  end
  ...
end

我从config / initializers中的初始化程序中调用它:

require Rails.root + "lib" + "translation_enhancer.rb"
TranslationEnhancer::install! TranslationDictionary

现在,如果我在开发环境中启动服务器,在第一次请求期间一切正常。但是,在那个请求之后,@dictionaries突然变为零。我已经在TranslationEnhancer中评论了所有其他代码,因此我绝对相信每次请求时都必须重新加载整个模块。

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

ActiveSupport::Dependencies.explicitly_unloadable_constants << "TranslationEnhancer" 

但又失败了。我不知道如何解决这个问题,请帮助。

获得Ruby 1.9.2 @ Rails 3.1.rc4。

编辑:我知道我可以将字典设置为常量。但是我想将TranslationEnhancer用作库 - 所以我可以在不同的项目中不加改变地使用它并安装不同的目录,例如:

TranslationEnhancer.install! EnglishDirectory, FrenchDirectory

这些值在运行时期间会发生变化,它们只会将项目更改为项目。

2 个答案:

答案 0 :(得分:6)

解决!

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

答案 1 :(得分:0)

@dictionaries不是“类变量”。它是“类级实例变量”。 请在此处查看更好的解释:Class and instance variables

请尝试使用@@ dictionaries。