(特定の条件で) すべてのリクエストにリダイレクトを実装するにはどうすればよいですか?
-
01-07-2019 - |
質問
アプリ内のアカウントが無効になっている場合に、すべてのリクエストが「無効」メッセージにリダイレクトされるように設定したいと考えています。
これを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 v2.1 (私が使用しているもの) では、@controller がコントローラーになり、これが ApplicationController では機能しないことに気づきました。
このようなものを実装する最良の方法は何でしょうか?
解決
を使用することもできます skip_before_filter
フィルターを適用したくない 1 つのコントローラー/メソッドの場合。
他のヒント
いくつかの選択肢があります。
アクション メソッド「disabled」がアプリケーションのスコープ内で一意に名前付けされている場合は、次のように before_filter 呼び出しに例外を追加できます。
before_filter :check_account, :except => :disabled
フィルター内のコントローラーとアクションを特に確認したい場合は、このコードが既にコントローラー オブジェクトの一部であることに注意してください。次のように、「self」として参照できます。
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
まずはグローバル変数 $account を削除してみてはいかがでしょうか。基本的に、グローバルを使用することで、いくつかの深刻なバグに備えることになります。@ の代わりにインスタンス変数を使用するか、ApplicationController で @current_account インスタンス変数にアクセスする current_account というメソッドを作成することをお勧めします。
オーバーライドが多すぎない場合は、リダイレクトフィルターに if を入れるだけです
アクション!=無効化Redirect()Endの場合