2011-08-03 5 views
6

私は変数application.html.erbにアクセスしたいので、すべてのビューで利用できます。私はそれを各コントローラに追加して各機能に追加することができるので、インデックス作成、表示などが可能です。しかし、それは狂っています。それをヘッダーに入れたいのであれば、application.html.erbファイルにアクセスできるはずですので、すべてのビューにあります。それはで働いている私のコントローラの1例...RoR変数をapplication.html.erbで利用できるようにして、ヘッダのすべてのビューに表示するようにしました。

 def index 
    if session[:car_info_id] 
     @current_car_name = current_car.name 
    end 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @miles } 
    end 
    end 

はここでApplicationControllerにの私の関数である。

private 

    def current_car 
    CarInfo.find(session[:car_info_id]) 
    end 

私はApplicationControllerにに@current_car_name = current_car.nameを追加しようとするので、変数は私のapplication.html.erbで利用可能です。これはRouting to current_carエラーで爆撃されます。私は別のコントローラでそれを呼び出すと正常に動作し、そのインデックスビューで生成された変数にアクセスすることができるので、関数が機能することが分かります。関数を一度呼び出す方法を知っているだけで、変数がすべてのビューにアクセスできるようにする必要があります。私は情報をセッション変数に入れることができましたが、セッション変数をidsに制限し、それらのidsから他の必要な情報を生成する必要があります。事前に

おかげで、

+0

このメソッドを非公開にしないでください。アプリケーションコントローラは常に別のコントローラの基本クラスであるため、プライベートメソッドは使用できません。基本クラスのプライベートメソッドは、サブクラスでは使用できません。これ以外にも、ディラン・マルコウの助言に従うことをお勧めします。 – Mischa

答えて

11

ちょうどあなたのapplication_controller.rbファイルに次のような行を追加して、あなたの意見にcurrent_carにアクセスする必要があります。あなたが本当にインスタンス変数を望んでいた場合は、次のよう

helper_method :current_car 

は、あなたのアプリケーションでbefore_filterを置くことができます。コントローラとビューの両方が@current_car変数にアクセスできるようになります。

class ApplicationController < ActionController::Base 
    before_filter :get_current_car 
    def get_current_car 
    @current_car = CarInfo.find(session[:car_info_id]) 
    end 
end 
+0

ありがとうございます。私はオプション1を実行し、それは働いた。あるオプションを他のオプションよりも使用することがわかっている理由はありますか? – Xaxum

+6

@ xaxumこの回答はほぼ1年遅れですが、将来の訪問者のために:helper_methodsはビューで使用されるたびに呼び出されますが、before_filtersはビューが実行される前に一度呼び出されます。私はCarInfoを何度も調べ続ける必要がないように、before_filterを使用します。 – mpdaugherty

関連する問題