2

エンジン内のActiveResourceオブジェクトを呼び出していますが、スレッドセーフな方法でヘッダーを設定する必要があります。

エンジンに/lib/mymodule.rbがあり、次のようになります。

module MyModule
  def self.my_method()
    begin
       data = WebResource.find(:all) # Where WebResource < ActiveResource::Base
    rescue
       data = nil
    end

    return data
  end
end

次に、ビュー/コントローラーで、このメソッドを大まかに次のように呼び出します。

WebResource.headers[:some_id] = cookies[:some_id]
MyModule::my_method()

この質問をして読んだ後、クラスレベルでヘッダーを設定したため、これはスレッドセーフではないようです。

これらのヘッダーをスレッドセーフな方法で設定するための最良の方法は何ですか?

4

1 に答える 1

2

問題を解決しました。解決策はこの質問の影響を受けます。基本的に、self.headers()メソッドを上書きして、クラス変数ではなくThread.currentにヘッダーを格納します。

次のようになります。

class WebResource < ActiveResource::Base

  # ...

  class << self

    def headers
      Thread.current["active.resource.currentthread.headers"] = {} if Thread.current["active.resource.currentthread.headers"].blank?
      Thread.current["active.resource.currentthread.headers"]
    end

  end
end
于 2012-09-20T14:02:48.200 に答える