2010-11-22 9 views
1

私はアプリケーション全体でグローバルに利用可能な変数を持っています(applicationControllerに@accountを設定しています)。Railsプラグインからアプリケーション変数にアクセスする

しかし、私が持っているプラ​​グインは同じ変数にアクセスする必要があります。

注:この変数は、リクエストごとに異なります。

このアーキテクチャを作成する最も良い方法は何ですか?

答えて

0

たぶん、このような何かが動作します:

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 %> 
+0

これは各スレッドが独立しているように動作しますか?私はユーザー間でストリームを渡りたくない... –

+0

今のところ、Railsは通常はシングルスレッドです。インスタンス変数 '@ current'を使う代わりに、' Thread.current [:current_account] 'を使って安全に使うことができます。 – Arsen7

0

あなたのアプリケーションコントローラの@accountを設定しても、アプリケーション全体でグローバルに使用できるわけではありません。たとえば、モデルはそれをアクセスできません。コントローラ内に設定されたインスタンス変数は、コントローラまたはビューでのみ使用できます。プラグインにコントローラとビューコードがある場合、プラグインコントローラコードが実行される前に変数が設定されている限り、このコードは通常の方法で変数にアクセスできるはずです。

あなたが何をしたいのか(つまり、どこに@accountにアクセスしたいか)について詳細を述べると、誰かが良いアプローチを提案することができます。

+0

@accountは、リクエストごとにbefore_filterに設定されています。 プラグインはいくつかのARクエリにデフォルトスコープを追加します –

関連する問題