2011-06-29 8 views
4

appllicationコントローラには、要求されたコントローラとアクション名で動作する2つのメソッドがあります。ApplicationControllerのparams値を持つクラス変数

DRY principeに従うには、これらのパラメータで共有変数を定義する必要があります。

class ApplicationController < ActionController::Base 
    @@requested_action  = params[:action] 
    @@requested_controller = params[:controller] 
end 

しかし、私はエラーを取得:私はこれを行うことはできませんし、どのように私は私の目標を達成することができundefined local variable or method "params" for ApplicationController:Class

なぜ?

答えて

4

私はあなたがすでに、この目的のためにレールによって定義されたcontroller_nameaction_name変数を持っていると信じています。

あなたがそれをやりたいのであれば、要求が行われた後にparamsが存在するようになる前に、フィルタをbeforeフィルタとして定義する必要があります。あなたはこのようなことをすることができます

@controller_nameと@action_nameとしてアクセスできます。しかし、controller_nameaction_nameはすでにRailsで定義されています。それらを直接使用することができます。

+0

Cool!私は彼らがすでに何を設定しているのか分からない。ありがとう! –

+0

ありがとうございます。 Rails 4.2.1でのテスト、ApplicationControllerのbefore_filterの外では、controller_nameは "application"です。 action_nameとparamsは存在しません。 before_filterの中で、controller_nameはロードされているコントローラに対応し、他の2つも設定されています。したがって、要求がなされるまで存在しないparamsに関するコメントはまだ有効です。 –

2

使用インスタンスメソッドの代わりに:

class ApplicationController < ActionController::Base 
    def requested_action 
    params[:action] if params 
    end 
end 
2

あなたはオプションbefore_filterを使用することができます。

class ApplicationController < ActionController::Base 
    before_filter :set_share_variable 

    protected 

    def set_share_variable 
    @requested_action  = params[:action] 
    @requested_controller = params[:controller] 
    end 
end 
関連する問題