0

ファラデーを使用してAPIにリソースの多いリクエストを行うパブリックヘルパーライブラリであるAPI gemがあります。セッション データが (ハッシュの形式で) 存在するかどうかをチェックし、存在する場合は、これらの値をファラデーの要求の引数にマージするミドルウェアを作成したいと考えています。

私の最初の試みは、gem の最上位クラス (つまり MyGem.global_params) にメタクラス attr_accessor (global_params) を設定することでした。ミドルウェアは、必要なデータについてこの変数をチェックできます。これは、私のライブラリにアクセスできるすべての ApplicationController が、セッション データに基づいて global_params を設定する before_filter を実装でき、after_filter がそれをクリアできることを意味していました。そのため、ApplicationController のそのインスタンスによって行われたすべてのファラデー リクエストは、同じ global_params セット フォームを共有します。セッションデータ。

これがスレッドセーフかどうか疑問に思っています..そうでない場合、これを処理できる別の方法は何ですか?

4

1 に答える 1

0

あなたの他の質問に関しては、グローバルはほとんどの場合、それが間違っていることの兆候であり、可能な限り避けるべきです.

ここで必要なのは、必要に応じてコンテキストをカスタマイズできるファクトリ メソッドです。

たとえば、おそらく次のようなことをしています。

MyGem.global_arg = :foo
MyGem.new(...)

代わりにできることは次のとおりです。

factory = MyGem.factory(:global_arg => :foo)

factory.new(...)

または、同様の感覚を維持するには、次のようにします。

factory = MyGem.factory do |factory|
  factory.global_arg = :foo
end

MyGem でを作成する代わりに、mattr_accessorMyGem がデフォルトのインスタンスを持つことができる独立したオブジェクトとして作成します。

于 2012-11-29T22:15:08.343 に答える