Ruby / Sinatra - 无需重定向即可重定向

时间:2012-10-03 15:23:10

标签: ruby sinatra

在我的控制器中,我有以下

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 =真

1 个答案:

答案 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