2016-07-01 3 views
1

私はRailsのDRYコンセプトについて多くのことを学んでいますので、ここに私の質問です:Locationsのような、常に様々なオブジェクトをロードする必要がある私のアプリケーションには固定サイドバーがあります。私indexページに関連したコントローラで グローバル変数はどこにありますか?

、実際 controllers/pages_controller.rbに私は @locationsロードしています:私は場所を選択してロードすると、しかし、私のナビゲーションメニュー(サイドバー)のために正常に動作します

@company = current_user.company 

@locations = if @company 
    current_user.company.locations.order(:name) 
else 
    [] 
end 

別のコントローラ(この場合はlocations/show.html.erb)から代理されたビューmy @locations変数は検出されません。

確かに、すべての(私は私のlocations_controller.rbファイルにshow方法にそれを追加することができ、それは、私は、サイドバーのナビゲーションメニューに依存しているすべての単一のコントローラメソッドで上記のコードを配置する必要があるだろう考えると非常に乾燥していませんそれらは固定されているので)。

これを一度実行して、すべてのコントローラでそれを行う必要はありませんDRY方法は何ですか?

答えて

1

あなたpages_controllerに続いて、あなたのapplication_controller

def set_locations 
.... 
end 

でメソッドを作成することができますし、locations_controllerが追加それは前にすべてのページと場所のすべてのメソッドを呼び出しセットの場所を設定しますbefore_filter

before_filter :set_locations 

コントローラ。あなたはわずか数コントローラアクションのための場所を設定したい場合は

その後、呼び出し:

before_filter :set_locations,:only=>[:show,:index, :your_action_name] 

更新:5 before_filterが廃止されました

Railsでは、あなたが

+1

before_actionを使用することができます**ただ、注意:** Rails 5ではbefore_filterが廃止されたので、代わりに 'before_action'コールバックを使用します。 – bntzio

0

すべてのアクションが実行される前に実行されるメソッドでApplicationControllerに追加することができます。すべてのコントローラはこのApplicationControllerから継承して使用可能になります。

関連する問題