由于某种原因,在Sinatra“之后”过滤器中我似乎无法访问当前状态代码
require 'rubygems'
require 'sinatra'
after do
puts "After hook with code: #{response.status}"
end
get '/hi' do
halt(401, "wtf?")
end
运行curl 127.0.0.1:4567/hi时,会产生:
After hook for code: 200
答案 0 :(得分:3)
它基本上是在Sinatra中如何实现这些方法的功能。我们需要注意的方法是call!
,invoke
和dispatch!
,Sinatra::Base中的所有方法(截至v1.3.2)。
call!
是顶级方法,在那里,它调用以下代码行:
invoke { dispatch! }
现在,invoke
看起来像这样:
def invoke
res = catch(:halt) { yield }
res = [res] if Fixnum === res or String === res
if Array === res and Fixnum === res.first
status(res.shift)
body(res.pop)
headers(*res)
elsif res.respond_to? :each
body res
end
end
它实际上是根据throw
与:halt
的内容设置响应代码。而dispatch!
看起来像是:
def dispatch!
static! if settings.static? && (request.get? || request.head?)
filter! :before
route!
rescue ::Exception => boom
handle_exception!(boom)
ensure
filter! :after unless env['sinatra.static_file']
end
看到ensure
阻止?当:halt
符号已经thrown
在堆栈跟踪上运行时,它就会运行。至关重要的是,这是之前运行状态设置代码。