Ruby on rails &引用;“无法识别的类型”;haml视图中出错,但控制台中没有

Ruby on rails &引用;“无法识别的类型”;haml视图中出错,但控制台中没有,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个小程序库,比如widget_utils.rb,它位于应用程序的lib/目录中。(我已将配置设置为从lib/自动加载源文件) UTIL包括“spira”gem,它基于RDF.rb进行ORM映射。在widget_utils.rb文件中,是基于我的RDF存储库的类对象,它们引用一种称为Spira::Types::Native的类型 我在WidgetUtils中有一个静态方法,它返回一个基于RDF数据的散列,用于渲染,WidgetUtils.options_for_select 如果我启动控制台

我有一个小程序库,比如widget_utils.rb,它位于应用程序的lib/目录中。(我已将配置设置为从lib/自动加载源文件)

UTIL包括“spira”gem,它基于RDF.rb进行ORM映射。在widget_utils.rb文件中,是基于我的RDF存储库的类对象,它们引用一种称为Spira::Types::Native的类型

我在WidgetUtils中有一个静态方法,它返回一个基于RDF数据的散列,用于渲染,WidgetUtils.options_for_select

如果我启动控制台,我可以调用WidgetUtils.options\u进行选择,并完全返回哈希

但是如果我运行服务器,并尝试呈现/widget/1234或/widget/1234/edit以显示一个小部件,则会出现无法识别的错误类型:Spira::Types::Native

在我的堆栈跟踪的底部是widget_controller.rb,在某个点上,haml文件正在“加载”lib/widget_utils.rb,并在util源文件中引用的点与无法识别的类型崩溃

如果我在控制台中“加载”lib/widget_utils.rb“没有得到任何错误,则类型被成功识别


我被难住了,而且对rails来说太陌生了,除了尝试和错误之外,我无法成功地想出解决这个问题的策略。

事实证明,这个问题是我正在使用的Spira库和服务页面时的JRuby所特有的

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

如果您试图通过类变量等使数据全局化,那么在JRuby下也会出现类似的问题。需要找到其他一些机制,使全局引用数据可供所有服务线程使用。(可变的共享数据甚至不需要考虑,除非你喜欢头痛)。 Spira有一个解决方案,可以保持其设置可用。在我的实用程序类中,我添加了此monkey修补程序以取消Thread.local的设置:

module Spira
  def settings
    @settings ||= {}
  end
  module_function :settings
end

事实证明,这个问题与我正在使用的Spira库以及提供页面服务时的JRuby有关

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

如果您试图通过类变量等使数据全局化,那么在JRuby下也会出现类似的问题。需要找到其他一些机制,使全局引用数据可供所有服务线程使用。(可变的共享数据甚至不需要考虑,除非你喜欢头痛)。 Spira有一个解决方案,可以保持其设置可用。在我的实用程序类中,我添加了此monkey修补程序以取消Thread.local的设置:

module Spira
  def settings
    @settings ||= {}
  end
  module_function :settings
end

我开始怀疑我是否在处理Spira库及其线程局部变量使用中的一个特定问题:这看起来非常恰当:“Spira.types in threads,”可能与我的JRuby servlet线程管理有关。我开始怀疑我在处理Spira库及其线程局部变量的使用时是否遇到了一个特定的问题:这看起来非常恰当:“Spira.types in threads”,可能与我的JRuby servlet线程管理有关。