我有一个小型库,比如说widget_utils.rb,它位于应用程序的lib /目录中。 (我已将配置设置为从lib /自动加载源文件)
utils包含'spira'gem,它基于RDF.rb进行ORM映射。在widget_utils.rb文件中是基于我的RDF存储库的类对象,它们引用了一个名为Spira :: Types :: Native的类型。
我在WidgetUtils中有一个静态方法,它返回一个基于RDF数据的哈希,用于渲染WidgetUtils.options_for_select。
如果我启动控制台,我可以调用WidgetUtils.options_for_select并完美地恢复我的哈希值。
但是如果我运行服务器,并尝试渲染/ widget / 1234或/ widget / 1234 / edit来显示一个小部件,我会收到错误无法识别的类型:Spira :: Types :: Native
我的堆栈跟踪底部是widget_controller.rb,并且在某些时候haml文件正在“加载”“lib / widget_utils.rb”,并且在它被引用的位置使用Unrecognized类型崩溃util源文件。
如果我执行“加载'lib / widget_utils.rb',从控制台”我没有错误,类型被成功识别。
我很难过,并且对于成功提出一种策略来解决这个问题而不是试验和错误。
答案 0 :(得分:0)
事实证明,这个问题特定于我正在使用的Spira库,以及JRuby在提供页面时。
Spira将其收集的已知RDF类型保存在“设置”哈希中,使其成为本地线程。在MRI Ruby / Rails的大多数普通情况下,这不是问题,因为请求通常在与Spira初始化相同的线程中处理。
如果你试图通过类变量使数据全局化,JRuby下会发生类似的问题。需要找到一些其他机制来使全局参考数据可用于所有服务线程。 (除非您喜欢头痛,否则可变共享数据甚至无法考虑。)
Spira有一种解决方法可以保持其设置可用。在我的实用程序类中,我添加了这个猴子补丁来从Thread.local中取出设置:
module Spira
def settings
@settings ||= {}
end
module_function :settings
end