특정 조건에서 모든 요청에 ​​대해 리디렉션을 구현하는 방법은 무엇입니까?

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 필터를 적용하고 싶지 않은 하나의 컨트롤러/메서드에 대해.

다른 팁

몇 가지 옵션이 있습니다.

작업 메서드 "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를 제거하는 것은 어떻습니까?기본적으로 전역을 사용하여 심각한 버그에 대비하고 있습니다.@ 대신 인스턴스 변수를 사용하거나 @current_account 인스턴스 변수에 액세스하는 current_account라는 ApplicationController에 메서드를 만드는 것이 더 좋습니다.

재정의가 너무 많지 않으면 리디렉션 필터에 if를 넣으십시오.

action! = 비활성화 된 리디렉션 () 끝

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top