我有这个简单的代码:
require 'sinatra'
before do
redirect '/login'
end
get '/login' do
'hello'
end
get '/test' do
'should not show'
end
这个简单的应用程序应该重定向每个路线,包括/test
到login
路线。相反,我正在获得重定向循环。
我使用最新版本的Sinatra 2.0.5。
您需要从before_filter中排除/login
路由
before do
redirect '/login' if request.path_info != "/login"
end
上面提供了一个解决方案,但解释是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)。