我正在同时处理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
如您所见,我将提供的代码块保存在类实例变量中。访问它们可能很好,可能有5个请求中的4个,但间歇性失败:访问者返回nil
。我无法弄清楚为什么会这样。
有人能看出问题所在吗?