私はアプリケーション全体でグローバルに利用可能な変数を持っています(applicationControllerに@accountを設定しています)。Railsプラグインからアプリケーション変数にアクセスする
しかし、私が持っているプラグインは同じ変数にアクセスする必要があります。
注:この変数は、リクエストごとに異なります。
このアーキテクチャを作成する最も良い方法は何ですか?
私はアプリケーション全体でグローバルに利用可能な変数を持っています(applicationControllerに@accountを設定しています)。Railsプラグインからアプリケーション変数にアクセスする
しかし、私が持っているプラグインは同じ変数にアクセスする必要があります。
注:この変数は、リクエストごとに異なります。
このアーキテクチャを作成する最も良い方法は何ですか?
たぶん、このような何かが動作します:
class Account
def self.current
@current
# or: Thread.current[:current_account]
end
def self.current=(a)
@current = a
# or: Thread.current[:current_account] = a # ..if you want to be thread-safe.
end
...
end
# your controller's before_filter:
def assign_account
...
Account.current = @account # But remember to set nil if none found!
end
# Any code in your app (view, model, almost anything):
<%= Account.current.name if Account.current %>
あなたのアプリケーションコントローラの@accountを設定しても、アプリケーション全体でグローバルに使用できるわけではありません。たとえば、モデルはそれをアクセスできません。コントローラ内に設定されたインスタンス変数は、コントローラまたはビューでのみ使用できます。プラグインにコントローラとビューコードがある場合、プラグインコントローラコードが実行される前に変数が設定されている限り、このコードは通常の方法で変数にアクセスできるはずです。
あなたが何をしたいのか(つまり、どこに@accountにアクセスしたいか)について詳細を述べると、誰かが良いアプローチを提案することができます。
@accountは、リクエストごとにbefore_filterに設定されています。 プラグインはいくつかのARクエリにデフォルトスコープを追加します –
これは各スレッドが独立しているように動作しますか?私はユーザー間でストリームを渡りたくない... –
今のところ、Railsは通常はシングルスレッドです。インスタンス変数 '@ current'を使う代わりに、' Thread.current [:current_account] 'を使って安全に使うことができます。 – Arsen7