2011-12-03 18 views
2

私は、アプリケーションのlib /ディレクトリにある小さなライブラリ、たとえばwidget_utils.rbを持っています。 (私はlib /からソースファイルを自動ロードするように設定しました)hamlビューで「認識できない型」エラーが発生しましたが、コンソールではありません

utilsには、RDF.rbに基づいたORMマッピングを行う 'spira' gemが含まれています。 widget_utils.rbファイルには、私のRDFリポジトリに基づくクラスオブジェクトがあり、Spira :: Types :: Nativeというタイプを参照しています。

WidgetUtilsには、WidgetUtils.options_for_selectのレンダリングで使用するRDFデータに基づくハッシュを返す静的メソッドがあります。

コンソールを起動すると、WidgetUtils.options_for_selectを呼び出してハッシュを完全に取得できます。

しかし、私は、サーバーを実行して、1つのウィジェットを表示/ウィジェット/ 1234または/ウィジェット/ 1234 /編集をレンダリングしようとすると、私はエラーが認識されないタイプ取得:スピラ::タイプ::ネイティブ

で私のスタックトレースの一番下はwidget_controller.rbで、ある時点でhamlファイルは "lib/widget_utils.rb"の "load"を実行していて、utilソースファイルで参照されているポイントでUnrecognizedタイプでクラッシュします。

コンソールから「lib/widget_utils.rbをロードしてください」「エラーは発生しません。タイプは正常に認識されます。

私は困惑しており、試行錯誤以外でもこの問題を解決するための戦略を策定するにはあまりにも新しくなっています。

+0

私はSpiraライブラリとその使用に関する特定の問題に取り組んでいるのか疑問に思っていますスレッドローカル変数:https://github.com/datagraph/spira/issues/36 – Mojo

+0

これは非常にaproposを見て始めています:https://github.com/datagraph/spira/pull/41 "Spira.types in threads 「JRubyサーブレットのスレッド管理に関連する可能性があります。 – Mojo

答えて

0

この問題は、私が作業しているSpiraライブラリと、ページを提供するときにJRubyに固有の問題です。

Spiraは、収集された既知のRDFタイプを、スレッドをローカルにする「設定」ハッシュに保持します。 MRI Ruby/Railsのほとんどの通常の状況では、リクエストは通常​​Spiraの初期化と同じスレッドで処理されるため、これは問題ではありません。

たとえば、クラス変数などでデータをグローバルにしようとすると、JRubyでも同様の問題が発生します。すべてのサービススレッドがグローバル参照データを利用できるようにするには、その他のメカニズムが必要です。 (変更可能な共有データは、頭痛のようなものでなければ考慮すべきものでもありません)

設定を有効にするための回避策があります。私のユーティリティクラスでは、この猿パッチを追加してThread.localの設定を取りました:

module Spira 
    def settings 
    @settings ||= {} 
    end 
    module_function :settings 
end 
関連する問題