Сброс переменной класса с помощью направляющих / пружины

Я определил класс как таковой:

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 доступен, чего, скорее всего, не будет в производстве.

Другие вопросы по тегам