gpt4 book ai didi

ruby - "after"过滤器中的 Sinatra response.status

转载 作者:太空宇宙 更新时间:2023-11-03 18:27:09 24 4
gpt4 key购买 nike

出于某种原因,在 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

最佳答案

它基本上是方法在 Sinatra 中的实现方式的函数。我们需要注意的方法是call!invokedispatch!,都是Sinatra::Base中的方法(从 v1.3.2 开始)。

call! 是顶级方法,在其中调用以下代码行:

invoke { dispatch! }

现在,调用看起来像这样:

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

它实际上根据您使用:haltthrow 的内容设置响应代码。 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 block 了吗?当 :halt 符号被 thrown 沿堆栈跟踪向上航行时,它就会运行。至关重要的是,这是在运行状态设置代码之前

关于ruby - "after"过滤器中的 Sinatra response.status,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9368540/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com