특정 조건에서 모든 요청에 대해 리디렉션을 구현하는 방법은 무엇입니까?
-
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! = 비활성화 된 리디렉션 () 끝