(特定の条件で) すべてのリクエストにリダイレクトを実装するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/89543

  •  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の場合

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top