【问题标题】:Why is my class variable being re-initialized using cattr_accessor (JRuby, Rails)为什么我的类变量使用 cattr_accessor (JRuby,Rails)重新初始化
【发布时间】:2011-02-26 02:39:36
【问题描述】:

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

这基本上是我的代码

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。

这是预期的行为吗?如果是的话,你能解释一下为什么,因为对我来说,分配应该只发生一次。

【问题讨论】:

  • 仅供参考,仅当变量的 nil 可以表示为:@@an_attr ||= {}

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


【解决方案1】:

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

但是,即使在生产环境中,此变量对于特定的应用程序实例也是本地的 - 例如,如果您使用两个 Mongrel 运行,每个 Mongrel 将具有此变量的不同版本。

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

【讨论】:

  • 这很有帮助,我试图保留的东西不合理地存储在数据库或 cookie 中,因为它是代表活动连接的 Java 对象(记住这是 JRuby)到第三方系统。我应该把它存放在哪里?
  • 在这种情况下,我实际上可能将它存储在一个类变量中。在开发中,您必须在每个请求上重新连接到第三方服务,但在生产中,您的应用程序的每个实例都将保持自己的连接。如果没有运行您自己的服务来维持连接,我不确定您还能做什么。
  • @@3rdpartysystem ||= ThirdPartySystem.connection
  • 使用您对“类缓存”的建议,我可以通过谷歌搜索以下探讨该主题的链接...zadasnotes.blogspot.com/2011/02/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多