3

我有一个这样定义的类:

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,我知道如果我杀死/停止 spring,它会再次工作一段时间。跟春天有关系吗?

4

2 回答 2

2

好的,所以这完全与 Spring 相关,我通过移除 spring 来修复它。

感谢@NekoNova 指出了文档的正确部分,我发现

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

[...]

所以为了避免这个问题,不要在初始化代码中保存对应用程序常量的引用。

换句话说,我不能使用初始化器来初始化我的类,因为虽然它可以在生产环境中工作,但在开发环境中却无法工作。

于 2015-04-17T09:09:09.413 回答
2

I know this is rather old, but I have encountered this issue a couple of times, and feel that you don't have to abandon spring if you set class level variables at initialization.

All you need to do is re-assign them in a spring ".after_fork" block. So for the above issue, place in a "config/spring.rb" file, the following:

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

This will reset those variables after spring completes the fork and reloading code. I wrap it in a check to ensure that Spring is available, which it likely won't be in production.

于 2017-02-17T15:02:27.193 回答