2008-09-18 11 views
3

アプリ内のアカウントが無効になっている場合、すべてのリクエストを「無効にする」メッセージにリダイレクトするように設定する必要があります。私はApplicationControllerにでこれを設定したすべてのリクエストにリダイレクトを実装する方法(特定の条件で)

:もちろん

class ApplicationController < ActionController::Base 
    before_filter :check_account 

    def check_account 
    redirect_to :controller => "main", :action => "disabled" and return if !$account.active? 
    end 
end 

アカウントがアクティブでない場合、それは無限ループに入ると、これはかなりのない作業を行います。私のようなものを使用することを願っていた。

redirect_to :controller => "main", :action => "disabled" and return if !$account.active? && @controller.controller_name != "main" && @controller.action_name != "disabled" 

を私はRailsのバージョン2.1(私が使用しているどのような)で、@Controllerが現在のコントローラであることに気づいた、これはApplicationControllerにで動作するようには思えません。

このようなものを実装するにはどうすればよいでしょうか?

答えて

3

また、使用することができます1つのコントローラー/メソッドに対してフィルタを適用しない場合はskip_before_filterを適用します。

+0

私はそれを実装する最もクリーンな方法かもしれないと思います。ありがとうございました! –

0

リダイレクトフィルタ

であればtheresのではなく、あまりにも多くのオーバーライドはその後、ちょうど入れた場合であれば、アクション!=無効 リダイレクト() 終了

6

あなたはいくつかのオプションがあります。

あなたのアクションメソッド「無効」は一意のアプリケーションの範囲で命名されている場合は、あなたがこのようなbefore_filterコールに例外を追加することができます:あなたは、コントローラのために特別に確認したい場合は

before_filter :check_account, :except => :disabled 

このアクションがフィルタのアクションである場合、このコードはすでにコントローラオブジェクトの一部であることに注意してください。あなたはそうのような「自己」としてそれを参照することができます

def check_account 
    return if self.controller_name == "main" && self.action_name == "disabled" 

    redirect_to :controller => "main", :action => "disabled" and return if !$account.active? 
    end 

を最後に、あなたが好きならば、あなたはMainController.rb内からフィルタ方法を上書きすることができます。

def check_account 
    return if action_name == "disabled" 
    super 
    end 
1

まずグローバル変数$ accountを取り除くのはどうですか?基本的には、グローバルを使用していくつかの深刻なバグを修正しています。 @の代わりにインスタンス変数を使用するだけで、@ current_accountインスタンス変数にアクセスするcurrent_accountというメソッドをApplicationController上に作成するだけです。

+0

ちょっとエリック、ヘッドアップのおかげで。私はそれを行う良い方法があると確信していました、私はcurrent_accountメソッドは行くのに最適な方法だと思う。乾杯! –

関連する問題