haml视图中的“无法识别的类型”错误,但不是控制台

时间:2011-12-03 21:26:12

标签: ruby-on-rails ruby-on-rails-3

我有一个小型库,比如说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',从控制台”我没有错误,类型被成功识别。

我很难过,并且对于成功提出一种策略来解决这个问题而不是试验和错误。

1 个答案:

答案 0 :(得分:0)

事实证明,这个问题特定于我正在使用的Spira库,以及JRuby在提供页面时。

Spira将其收集的已知RDF类型保存在“设置”哈希中,使其成为本地线程。在MRI Ruby / Rails的大多数普通情况下,这不是问题,因为请求通常在与Spira初始化相同的线程中处理。

如果你试图通过类变量使数据全局化,JRuby下会发生类似的问题。需要找到一些其他机制来使全局参考数据可用于所有服务线程。 (除非您喜欢头痛,否则可变共享数据甚至无法考虑。)

Spira有一种解决方法可以保持其设置可用。在我的实用程序类中,我添加了这个猴子补丁来从Thread.local中取出设置:

module Spira
  def settings
    @settings ||= {}
  end
  module_function :settings
end
相关问题