Я работаю над движком Rails и хост-приложением одновременно.Я пытаюсь предоставить способ для хост-приложения передавать блоки кода на один из контроллеров движка, которые он будет вызывать в определенное время.
У хост-приложения есть файл config/initializers
, содержащий это:
MyEngine::TheController.add_doc_hook(:some_key) do
# Some code to execute
end
... и в контроллере двигателя я называю определенный хук (если он есть) следующим образом:
def update
# some code...
run_doc_hook(:some_key)
# more code...
end
Вот методы доступа в контроллере двигателя:
# Getter for the blocks - usually returns correctly but sometimes returns nil
def self.doc_hooks
@doc_hooks
end
# Setter - called by the host application
def self.add_doc_hook(name, &block)
@doc_hooks ||= {}
@doc_hooks[name] = block
end
А вот метод для запуска заданного хука:
protected
# Run pre-set hooks, which can be specified by the host application
def run_doc_hook(name, *args)
hooks = self.class.doc_hooks # HERE - this is sometimes nil
if hooks && hooks.has_key?(name) && hooks[name].respond_to?(:call)
hooks[name].call(*args)
end
end
Как видите, я сохраняю предоставленные блоки кода в переменной экземпляра класса.Доступ к ним работает нормально, возможно, 4 из 5 запросов, но периодически завершается ошибкой : метод доступа возвращает nil
.Я не могу понять, почему это так.
Кто-нибудь может понять, в чем может быть проблема?