在rails app初始化之后重置Ruby类变量

时间:2010-06-15 04:08:16

标签: ruby-on-rails

我尝试像这样分配一个类静态变量

class QueryLogger < Logger
  @@query_logger_default_instance = nil
  def self.default_instance
    # Use global variable because static variable doesn't work
    @@query_logger_default_instance ||= self.new(STDOUT)
  end
end

在我的rails应用程序的initializers文件夹中,我添加了一个包含此代码块的文件

ActiveRecord::Base.logger = QueryLogger.default_instance

在请求(控制器的操作)中,我打电话给:QueryLogger.default_instance

我的假设是对default_instance的调用将始终报告相同的内容。但是,它没有。

现在我尝试通过在default_instance中设置断点来查看NetBeans中的内容。 事情按预期发生,default_instance被调用两次,一次是由于初始化程序块,另一次是由于对我的操作的调用。 令人惊讶的事情是,在两次中,@@ query_logger_default_instance报告都在NetBeans检查器中报告。第一个零报告是正确的,但第二个报告震惊了我。在rails app初始化之后,看起来静态变量会被重置。那里有魔法吗?

1 个答案:

答案 0 :(得分:4)

这取决于您是否在开发环境中运行,每个请求都会加载类,这就是您可以对它们进行更改并在不重新启动服务器的情况下查看它们的原因。

所以我认为你的类变量将为每个请求重置。

尝试在生产中运行。