2009-07-18 6 views
1

은 필터를 컨트롤러 클래스에 등록 된 필터 앞에 오는 추상 수퍼 클래스에 등록 할 때 레일에 표시됩니다. 필터 체인 끝에 필터로 인증이라는 메서드를 실행하려고한다고 가정 해보십시오. 내가 알아낼 수있는 유일한 방법은 before_filter를 모든 컨트롤러 클래스의 마지막 필터로 선언하는 것입니다 (그리고 그 중 많은 수가 있습니다). 수퍼 클래스에서이 필터를 선언하고 마지막으로 여전히 실행되도록하는 방법이 있습니까? 마지막으로 실행하려는 이유는 컨트롤러 클래스가 해당 컨트롤러에 대한 인증 요구 사항 만 수정할 수 있기 때문에 최종 인증 필터를 호출하기 전에 이러한 수정 사항을 고려해야하기 때문입니다.슈퍼 클래스의 필터 체인 맨 끝에 필터를 어떻게 추가합니까?

답변

2

사용 prepend_before_filter 대신 before_filter 또는 append_before_filter 대한 authenticate 콜백을 사용하지 않도록 선택할 수 있습니다.

+0

그 제안을 주셔서 고마워요,하지만 먼저 실행해야하는 추상 수퍼 클래스에서 메서드를 가지고있어 컨트롤러 클래스에서 prepend_before_filter를 호출하면 먼저 실행해야하는 필터보다 먼저 해당 필터가 밀려납니다. 들어오는 URL). –

+0

아마도 가장 가까운 대답 일 것이지만 원래 질문에는 실제로 대답하지 않습니다. 어쨌든 레일에서 그렇게 할 방법이 없다고 생각합니다. –

0

레일은 지역 일하기 전에, 먼저와 ApplicationController 호출 ... 그래서 당신은 (당신의 예를 사용하여) 같은 것을 할 수 있습니다 : 당신이 당신의 before_filter 콜백을해야합니다 응용 프로그램 컨트롤러에서

, 그리고 대응 방법 그 불려갑니다 : 작업중인 자원 유형 ...에 대한 컨트롤러에서

before_filter :authenticate 


def authenticate 
    # do something 
end 

이 당신은 다시 정의 할 수 있습니다

/무시 authenticate

def authenticate 
# do something else 
end 

당신은 몇 가지 방법 컨트롤러 클래스에서

skip_before_filter :authenticate, :only => :my_method_without_auth 
+0

고마워요.하지만 authenticate 메소드는 특정 허용치가 현재 동작이 '허용'인지 확인합니다. 이러한 허용치는 응용 프로그램 컨트롤러에서 호출 된 필터 전에 다른 필터에서 설정됩니다. 그러나, 내가 콘트롤러 클래스에서 만 트리거 될 수있는 허용치를 추가로 변경하고자하는 콘트롤러가 있고,이 콘트롤러가 인증에 의해 고려되기 위해서는 새로운 허용치가 설정된 후 인증이 실행되어야하므로 authenticate는 컨트롤러 클래스에서 선언되어야합니다. mod는 그 mod를 허용합니다. –

+1

왜 하나의 before_filter 콜백을 가지지 않고 그 메서드를 사용하여 필요한 모든 것을 순서대로 설정해야합니까? – mylescarrick

+0

그 아이디어는 실제로 실행 가능하지 않습니다. 필터가있어 이해할 수있는 방식으로 작업을 나눌 수 있다고 생각합니다. 이 인증 방법 외에도 모든 컨트롤러에서 실행됩니다. 이 컨트롤러는 모두 다른 일을합니다. –

관련 문제