Сброс переменной класса с помощью направляющих / пружины
Я определил класс как таковой:
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), то перезапускаю ее, в какой-то момент хеш будет пустым!
Почему переменная класса сбрасывается в этом случае?
Я использую рельсы 4.2.1 и пружину, и я знаю, что если я убью / остановлю пружину, она снова заработает некоторое время. Это связано с весной?
2 ответа
Хорошо, так что это было полностью связано с Spring, и я исправил это, удалив пружину.
Благодаря @NekoNova, который указал мне на правую часть документации, я обнаружил, что:
Это сохраняет первую версию класса User, которая не будет тем же объектом, что и User, после перезагрузки кода:
[...]
Поэтому, чтобы избежать этой проблемы, не сохраняйте ссылки на константы приложения в вашем коде инициализации.
Другими словами, я не могу инициализировать свои классы, используя инициализаторы, потому что, хотя он будет работать в производстве, он не будет работать в разработке.
Я знаю, что это довольно старо, но я сталкивался с этой проблемой пару раз и чувствую, что вам не нужно отказываться от 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 доступен, чего, скорее всего, не будет в производстве.