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

时间:2019-02-04 14:39:59

标签: ruby sinatra

我有这个简单的代码:

[{
Name : "Ram",
Id : 1,
Dept : "HR"
},
{
Name : "Shyam",
Id : 2,
Dept : "HR"
}]

该简单的应用程序应该将每条路由(包括{ Dept: "HR", Result: [{ Name : "Ram", Id : 1 }, { Name : "Shyam", Id : 2 } ] } 重定向到require 'sinatra' before do redirect '/login' end get '/login' do 'hello' end get '/test' do 'should not show' end 路由。相反,我遇到了重定向循环。

我使用的是最新版本的Sinatra 2.0.5。

2 个答案:

答案 0 :(得分:2)

您需要从before_filter中排除/login条路线

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

答案 1 :(得分: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。

     

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

     

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

因此,您可能需要一个助手(或者,如果要检查auth,则更可能是 condition )。