gpt4 book ai didi

ruby - 在 block 之前更改 Sinatra 中的参数

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

我正在尝试在 Sinatra 的 before block 中更改请求参数。

似乎在使用这种语法时,它是有效的:

before do
@params['global-before'] = 'yes'
end

但是当使用这种语法时,它不起作用:

before '/:id/test' do
@params['route-before'] = 'yes'
end

这是一个完整的例子:

# test.rb
require 'sinatra'
require 'sinatra/reloader'

set :bind, '0.0.0.0'
set :port, 3000

before do
@params['global-before'] = 'yes'
end

before '/:id/test' do
@params['route-before'] = 'yes'
end

get '/' do
params.to_json
end

get '/:id/test' do
params.to_json
end

然后运行:

$ ruby test.rb

$ curl localhost:3000
{"global-before":"yes"}

$ curl localhost:3000/123/test
{"global-before":"yes","id":"123"}

我期待看到 params['route-before'] 也被填充。

我试过使用 request.params 而不是 @params 但那根本不起作用。

任何人都可以阐明这一点吗?

更新:

打开一个issue在 Sinatra 的问题跟踪器中

最佳答案

路由过滤器先行,它有路由参数:{"id"=>"123"},所以this发生:

original, @params = @params, @params.merge(params) if params.any?

original{} 结束,@params{"id"=>"123"} 结束。当全局过滤器运行时,没有路由参数,所以 original 保持未分配状态(nil)并且 @params{} 原来在那里。

过滤处理后,在ensure子句中,有this :

@params = original if original

所以全局过滤器会跳过它,因为 originalnil,因为没有路由参数。路由过滤器将 @params 重置为过滤器运行之前的任何值,因为保留了 original,因为有路由参数。

我不能说这是错误还是预期的行为,但至少是“如何”,如果不是“为什么”的话。询问 Sinatra team 可能有意义(并在此处报告判决结果)。

tl;dr:如果过滤器的路径模式中有参数,@params 将重置为过滤器前状态。

注意:您可以通过创建自己的实例变量来破解它:

before '/:id/test' do
@route_before = 'yes'
end

get '/:id/test' do
"Did we run route before? #{@route_before}"
end

关于ruby - 在 block 之前更改 Sinatra 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57901075/

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