在我的控制器中,我有以下
post "/buy_item" do
redirect '/login' unless session[:name]
@owner = Market::User.user_by_name(params[:owner])
@item = @owner.item_by_id(params[:item].to_i)
@current_user = Market::User.user_by_name(session[:name])
if @current_user.buy_item?(@item)
@current_user.buy_item(@item)
else
redirect '/error'
end
end
当我强制使用“else
”时,我被正确地重定向到/error
,但之后我被重定向到另一个页面(/?loggedin=true
)。 redirect "/?loggedin=true"
是post "/login"
方法的最后一行。所以,它似乎以某种方式调用POST /login
..
/error
的路线如下:
get "/error" do
redirect '/login' unless session[:name]
template = ERB.new File.new($VIEWS_FOLDER + "/error.erb").read, nil, "%"
template.result(binding)
end
/error.erb
中的任何内容都没有重定向,当我直接调用 localhost:4567 / error 时,它不会被重定向。
这是日志:
127.0.0.1 - - [03 / Oct / 2012 17:15:03]“POST / login HTTP / 1.1”303 - 0.0012
localhost - - [03 / Oct / 2012:17:15:03 CEST]“POST / login HTTP / 1.1”303 0
localhost:4567 / login - > /登录
127.0.0.1 - - [03 / Oct / 2012 17:15:03]“GET /?loggedin = true HTTP / 1.1”200 3916 0.0055
localhost - - [03 / Oct / 2012:17:15:03 CEST]“GET /?loggedin = true HTTP / 1.1“200 3916
localhost:4567 / login - > /?的loggedIn =真
127.0.0.1 - - [03 / Oct / 2012 17:15:05]“POST / buy_item HTTP / 1.1”303 - 0.0030
localhost - - [03 / Oct / 2012:17:15:05 CEST]“POST / buy_item HTTP / 1.1” 303 0
localhost:4567 /?loggedin = true - > / buy_item
127.0.0.1 - - [03 / Oct / 2012 17:15:05]“获取/错误HTTP / 1.1”200 1609 0.0039
localhost - - [03 / Oct / 2012:17:15:05 CEST]“GET / error HTTP / 1.1”200 1609
localhost:4567 /?loggedin = true - > /错误
127.0.0.1 - - [03 / Oct / 2012 17:15:05]“GET /?loggedin = true HTTP / 1.1”200 3916 0.0063
localhost - - [03 / Oct / 2012:17:15:05 CEST]“GET /?loggedin = true HTTP / 1.1“200 3916
localhost:4567 / login - > /?的loggedIn =真
答案 0 :(得分:2)
您的路线'/buy_item'
内有两个重定向;并且在'/error'
redirect
之后你没有回来。 redirect
对您的HTTP标头执行某些操作,最好在通话后返回,即在/buy_item
和/error
路线中返回:
-redirect '/login' unless session[:name]
+unless session[:name]
+ redirect '/login'
+ return nil
+end
我参与了一个大型的Sinatra应用程序,并且重定向存在很多问题,上面的补丁应该会有所帮助。此外,我建议您查看HTTP RFC并熟悉Post-Redirect-Get scheme。要使用自定义状态代码重定向,您可以执行redirect '/foo', 303
。