2013-06-26 2 views
2

내 이해는 중단 명령은 현재 필터에서 요청을 중지해야하지만 계속해서 나타납니다. 다음은 이것을 설명하는 매우 간단한 Sinatra 앱입니다.중단 전 필터 여전히 계속 후 필터

나는 다음과 같은 위치에 '수'를 호출하고

require 'sinatra' 

before do 
    puts "before halt" 
    halt 401 
    puts "after halt" 
end 

before '/partners*' do 
    puts "i am in before /partners" 
end 

after '/partners*' do 
    puts "i am in after /partners" 
end 

get '/partners/v1/:public_id' do 
    puts "i am in the actual route" 
end 

server.rb]로 : localhost:4567/partners/v1/111
I 출력에 기대 :

before halt 

것은 실제로 출력 무엇 :

before halt 
i am in after /partners 

제 질문은 정확히 다음과 같습니다.정지 전혀 계속 않는 이유 1.
2. 이유는 무엇입니까는 after '/partners*' 아니라 before '/partners*'

+0

제 추측으로는 before 절에서 "멈추지"않을 수 있습니다. 아마도 sinatra devs에 대해 물어보십시오. 어쩌면 예상치 못한 것일 수도 있습니다 ... – rogerdpack

답변

1

Here is the code for halthere is the code for invoke, 그냥 invoke 아래에 충돌 (이 after '/partners*'에 도달로 표시) the method declaration for dispatch!

입니다

볼 수 있듯이 dispatch!halt ing을 지원하는 route 블록을 실행하는 invoke으로 전화합니다. 또한 invoke 블록에서 :before 필터를 실행합니다.

invoke do 
    static! if settings.static? && (request.get? || request.head?) 
    filter! :before 
    route! 

그래서 당신은 before 필터 내부 halt 그것을 당신이 경로 블록에서 모든 출력이 표시되지 않는 이유 경로를 도달하지 않을 수 있습니다. ,

ensure 
    begin 
    filter! :after unless env['sinatra.static_file'] 

ensure 그것이 말하는 않습니다 항상 평가됩니다

그러나, dispatch! 방법은 또한 ensure 있습니다. 이것이 after '/partners*' 블록이 처리되는 이유입니다. 이는 예상되는 동작입니다 (이 방법은 매우 명확하게 코딩되었으므로). 기본적으로 after 블록을 넣으면 halt 초에 상관없이 before 개의 필터 또는 경로 블록에 처리됩니다. 워드 프로세서

:

경로는 정의 된 순서에 일치합니다. 요청과 일치하는 첫 x 째 라우트가 호출됩니다.

and

... 필터는

지금, 워드 프로세서는 이것에 대해 명시하지 않는 경로와 같은 맥락에서 각 요청하기 전에 평가,하지만 당신은 두 가지를 추가하는 경우 따옴표를 함께 사용하면 "필터가 정의 된 순서대로 일치됩니다."라는 의미로 사용됩니다. 기본적으로 실제 동작에 맞기 때문입니다.

모든 before 필터를 실행해야하지만 첫 번째 필터에는 halt을 넣으므로 두 번째 필터 (before '/partners*')가 실행되지 않습니다.

+0

흥미롭게도 이것은 의존성이있는 필터 이후에 아무것도하지 말아야한다는 것을 의미합니다 필터 전에. 조금은 내 마음 속에는 직관력이 없지만 당신의 오른쪽 문서는 분명히 그것을 배치합니다. 감사! –

+0

@TylerA 네, 네가 맞다고 생각해. 'throw' /'catch'가 모든 처리를 멈추고'halt'은 그와 동의어가 아니며'after' 필터는'sure'에 대한 동의어와 유사하다는 것을 명심하면 올바른 것입니다 . 다행히 도울 수있어. – iain