Class 变量重置 rails / spring
Class variable reset with rails / spring
我有一个 class 定义如下:
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
为了注册不同的作业 classes,我放入了一个初始化程序:
PublicationJob.register(:tex, SaveJob)
PublicationJob.register(:saved_tex, TexJob)
#...
在rails console
我试试:
PublicationJob.jobs
#> {:tex => [SaveJob], :saved_tex => [TexJob]}
但是如果我退出控制台 (Ctrl-D) 然后重新启动它,在某些时候散列将为空!
为什么在这种情况下会重置 class 变量?
我使用 rails 4.2.1 和 spring,我知道如果我 kill/stop spring 它会再次工作一段时间。跟spring有关系吗?
好的,所以这完全是 Spring 相关的,我通过删除 spring.
来修复它
感谢@NekoNova 将我指向文档的正确部分,我找到了 that:
This saves off the first version of the User class, which will not be the same object as User after the code has been reloaded:
[...]
So to avoid this problem, don't save off references to application constants in your initialization code.
换句话说,我无法使用初始化器来初始化我的 类,因为尽管它可以在生产环境中运行,但在开发环境中却行不通。
我知道这有点老了,但是我遇到过几次这个问题,感觉如果在初始化时设置class级变量就不必放弃spring .
您需要做的就是 re-assign 它们在 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 完成分叉和重新加载代码后重置这些变量。我将其包装在支票中以确保 Spring 可用,它可能不会投入生产。
我有一个 class 定义如下:
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
为了注册不同的作业 classes,我放入了一个初始化程序:
PublicationJob.register(:tex, SaveJob)
PublicationJob.register(:saved_tex, TexJob)
#...
在rails console
我试试:
PublicationJob.jobs
#> {:tex => [SaveJob], :saved_tex => [TexJob]}
但是如果我退出控制台 (Ctrl-D) 然后重新启动它,在某些时候散列将为空!
为什么在这种情况下会重置 class 变量?
我使用 rails 4.2.1 和 spring,我知道如果我 kill/stop spring 它会再次工作一段时间。跟spring有关系吗?
好的,所以这完全是 Spring 相关的,我通过删除 spring.
来修复它感谢@NekoNova 将我指向文档的正确部分,我找到了 that:
This saves off the first version of the User class, which will not be the same object as User after the code has been reloaded:
[...]
So to avoid this problem, don't save off references to application constants in your initialization code.
换句话说,我无法使用初始化器来初始化我的 类,因为尽管它可以在生产环境中运行,但在开发环境中却行不通。
我知道这有点老了,但是我遇到过几次这个问题,感觉如果在初始化时设置class级变量就不必放弃spring .
您需要做的就是 re-assign 它们在 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 完成分叉和重新加载代码后重置这些变量。我将其包装在支票中以确保 Spring 可用,它可能不会投入生产。