2011-12-05 15 views
0

私はActiveResourceを使用するようにアプリケーションを移動しましたが、何かをするために自分自身に教えた方法を再考する必要があることがわかりました。これについて最善の方法を取るために。複数のコントローラ間で変数を便利に保つ方法

例えば、私は、特定のスコープのapplicationcontroller.rbに

@current_account ||= Account.where(etc etc) 

としてやったクエリの便利な発言の@current_accountを維持する必要があります。これは、APIの呼び出しが毎回行われるため、ARで役立つものではありません。私はapiへの呼び出しを最小限にしたいと思います(特に、私はすべてのクエリを実行したくない他の高価な呼び出しがある場合、それらを一度実行して便利にしたい)

したがって、Railsとは何ですか方法?私は変数を、特定のスコープ内のApplicationControllerから便利なAPIへのARコールで保持しなければならず、毎回それを書き出す必要はありません(またはAPIを毎回呼び出すか、ユーザーがアクセス可能なセッションに配置する必要はありませんそれは正確にテキスト/文字列ではないので、私が使用する必要があるオブジェクトです)。

私はこれをやっているべきか、そうしてはいけないのか、何が正しいDRYの方法なのかなど、他の人たちのやり方については興味があります。

すべての入力が高く評価されています。

+0

重複する質問を止めないでください:http://stackoverflow.com/questions/8370514/activeresource-caching – sethvargo

+0

これは、Railsアプリケーションプログラミングの文脈の中でより広い範囲を持つように意図されていました。浅いスキャンの代わりに読む時間を取ってください。 – blueblank

答えて

1

それは行動のこの種のモジュールを作成するのが最善です:次に

module CustomAuth 
    def self.included(controller) 
    controller.send :helper_method, :current_account, :logged_in? 
    end 

    def current_account 
    # note the Rails.cache.fetch. First time, it will 
    # make a query, but it caches the result and not 
    # run the query a second time. 
    @current_account ||= Rails.cache.fetch(session[:account_id], Account.where(...)) 
    end 

    def logged_in? 
    !current_account.nil? 
    end 
end 

、Railsが(私は./lib/custom_auth.rbに地雷を置く)このファイルをロードしていることを確認し、そう./config/application.rbconfig.autoload_pathsにそれを追加します。

# ./config/application.rb 
... 
config.autoload_path += %W(#{config.root}/lib) 
... 

インポートしますapplication_controller.rbCustomAuthモジュール:

class ApplicationController < ActionController::Base 
    include CustomAuth 
    protect_from_forgery 

    ... 
end 

最後に、決定的な:サーバー

NOTEを再起動し:あなたはcustom_auth.rbにメソッドを追加することができます。サーバーを再始動すると、そのサーバーが使用可能になります。これらのメソッドはビューでも使用できるため、ビューのすぐ内側でcurrent_account.nameと呼ぶことができます。

+0

これは私が知っている「DRYest」方法です。すべての認証名は1つのモジュールに保存されています。認証ロジックなどで 'application_controller.rb'を混乱させることはありません。 – sethvargo

関連する問題