带轨/弹簧的类变量复位

时间:2015-04-17 07:52:51

标签: ruby-on-rails ruby rails-spring

我有一个如此定义的类:

class PublicationJob < ActiveJob::Base
  def self.jobs
    @jobs ||= Hash{|h, k| h[k] = []}
  end
  def self.register(format, job_class)
    jobs[format] << job_class
  end
  # [...]
end

为了注册不同的工作类,我输入了一个初始化程序:

PublicationJob.register(:tex, SaveJob)
PublicationJob.register(:saved_tex, TexJob)
#...

我在rails console尝试:

PublicationJob.jobs
#> {:tex => [SaveJob], :saved_tex => [TexJob]}

但是如果我退出控制台(Ctrl-D)然后重新启动它,在某些时候哈希将是空的!

为什么在这种情况下会重置类变量?

我使用rails 4.2.1和spring,我知道如果我杀死/停止弹簧它会再次工作一段时间。它与春天有关吗?

2 个答案:

答案 0 :(得分:2)

我知道这是相当陈旧的,但我已经遇到过这个问题几次,并且如果你在初始化时设置了类级变量,你会觉得你不必放弃spring。

您需要做的就是在弹簧“.after_fork”块中重新分配它们。因此,对于上述问题,请将“config / spring.rb”文件放在以下位置:

if ("Spring".constantize rescue nil)
  Spring.after_fork do
    PublicationJob.register(:tex, SaveJob)
    PublicationJob.register(:saved_tex, TexJob)
  end
end

这将在spring完成fork和重新加载代码后重置这些变量。我将它包装在支票中以确保Spring可用,它可能不会在生产中。

答案 1 :(得分:1)

好的,所以这完全与Spring有关,我通过删除spring修复了它。

感谢@NekoNova指出我正确的文档部分,我找到了that

  

这将保存User类的第一个版本,在重新加载代码后,它将不会与User相同:

     

[...]

     

为避免此问题,请不要在初始化代码中保存对应用程序常量的引用。

换句话说,我无法使用初始化程序初始化我的类,因为虽然它在生产中工作,但它不会在开发中工作。