在Sinatra中过滤之前导致重定向循环

问题描述 投票:0回答:2

我有这个简单的代码:

require 'sinatra'

before  do
  redirect '/login'
end

get '/login' do
  'hello'
end

get '/test' do
  'should not show'
end

这个简单的应用程序应该重定向每个路线,包括/testlogin路线。相反,我正在获得重定向循环。

我使用最新版本的Sinatra 2.0.5。

ruby sinatra
2个回答
2
投票

您需要从before_filter中排除/login路由

before do
  redirect '/login' if request.path_info != "/login"
end

0
投票

上面提供了一个解决方案,但解释是redirect触发浏览器重定向,因此每次开始时该过程将再次开始。要使用服务器端重定向,请使用call。来自the docs

触发另一条路线

有时传球不是你想要的,而是你希望获得调用另一条路线的结果。只需使用call即可实现此目的:

get '/foo' do
  status, headers, body = call env.merge("PATH_INFO" => '/bar')
  [status, headers, body.map(&:upcase)]
end

get '/bar' do
  "bar"
end

请注意,在上面的示例中,只需将“bar”移动到/ foo和/ bar使用的帮助程序中,即可轻松进行测试并提高性能。

如果您希望将请求发送到同一个应用程序实例而不是重复,请使用call!而不是打电话。

如果您想了解有关呼叫的更多信息,请查看机架规格。

因此,您可能想要一个帮助器(或者更可能是一个条件,如果您正在检查auth)。

© www.soinside.com 2019 - 2024. All rights reserved.