gpt4 book ai didi

ruby - 暂停在 Before filter 仍然进行到 After filter

转载 作者:太空宇宙 更新时间:2023-11-03 16:30:15 34 4
gpt4 key购买 nike

所以我的理解是 halt 命令应该停止当前过滤器中的请求,但它似乎继续。下面是一个非常简单的 Sinatra 应用程序,演示了这一点。

服务器.rb

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

我在以下位置调用“get”:localhost:4567/partners/v1/111
我期望输出:

before halt

实际输出的是什么:

before halt
i am in after /partners

所以我的问题是:
1. 为什么停止会继续(显示为到达 after '/partners*')
2. 为什么它命中了after '/partners*' 而不是before '/partners*'

最佳答案

Here is the code for halthere is the code for invoke , 而在 invoke 下面是 the method declaration for dispatch!

如您所见,dispatch! 调用 invoke,它运行支持 halting 的路由 block 。它还在 invoke block 中运行 :before 过滤器。

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

因此,您可以在 before 过滤器内暂停,它不会到达路由,这就是您看不到路由 block 的任何输出的原因。

但是,dispatch! 方法还有一个ensure:

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

确保按照它说的去做,它总是会被评估。这就是处理 after '/partners*' block 的原因。这是预期的行为(因为它以这种方式编码得很清楚)。基本上,如果您放入 after block ,它将得到处理,而不管 before 过滤器或路由 block 中的 halts。

来自文档:

Routes are matched in the order they are defined. The first route that matches the request is invoked.

and

…filters are evaluated before each request within the same context as the routes

现在,文档并没有明确说明这一点,但是如果您将两个引号加在一起,我会认为它的意思是“过滤器按照它们定义的顺序进行匹配。”基本上,因为它符合实际行为。

所有 before 过滤器都应该运行,但是您在第一个过滤器中放置了一个 halt,所以第二个过滤器(before '/partners*') 不运行。

关于ruby - 暂停在 Before filter 仍然进行到 After filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331912/

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