为什么我的类变量使用cattr_accessor重新初始化(JRuby,Rails)

时间:2011-02-25 18:25:32

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

好的,我知道这是一个frankenstack,但我在Rails上运行JRuby,而且我对两者都比较新。我看到一些我无法理解的行为,而且我想知道我做错了什么或者我的堆栈有问题。基本问题是我的类属性似乎正在重新初始化,这是我不希望发生的事情。

这基本上是我的代码

class MyController < ActionController::Base
  cattr_accessor :an_attr
  before_filter :init_an_attr

  def init_an_attr
    if @@an_attr.nil? 
      @@an_attr = {}
    end
    # do some other stuff here
  end
end

问题在于每次调用init_an_attr时,if上的条件计算结果为true,最后我重新分配@@ an_attr。

这是预期的行为吗?如果是这样,你可以解释原因,因为对我而言,任务应该只发生一次。

1 个答案:

答案 0 :(得分:3)

在Rails中,在开发模式下运行时,不会缓存类。每个请求都会重新加载MyController和所有其他类。在生产中运行时,情况并非如此 - 类被缓存。

然而,即使在生产中,这个变量也是特定应用程序实例的本地变量 - 例如,如果你运行两个Mongrels,每个变量都有不同版本的变量。

如果要跨多个请求设置状态,请考虑使用会话或在数据库中存储值。类变量实际上不适合跨请求存储。