1

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

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

本地主机 - - [03/Oct/2012:17:15:03 CEST] "POST /login HTTP/1.1" 303 0

本地主机:4567/登录 -> /登录

127.0.0.1 - - [03/Oct/2012 17:15:03] “GET /?loggedin=true HTTP/1.1”200 3916 0.0055

本地主机 - - [03/Oct/2012:17:15:03 CEST] "GET /?loggedin=true HTTP/1.1" 200 3916

localhost:4567/login -> /?loggedin=true

127.0.0.1 - - [03/Oct/2012 17:15:05] “POST /buy_item HTTP/1.1”303 - 0.0030

本地主机 - - [03/Oct/2012:17:15:05 CEST]“POST /buy_item HTTP/1.1”303 0

本地主机:4567/?loggedin=true -> /buy_item

127.0.0.1 - - [03/Oct/2012 17:15:05] “GET /error HTTP/1.1”200 1609 0.0039

本地主机 - - [03/Oct/2012:17:15:05 CEST] "GET /error HTTP/1.1" 200 1609

本地主机:4567/?loggedin=true -> /error

127.0.0.1 - - [03/Oct/2012 17:15:05] “GET /?loggedin=true HTTP/1.1”200 3916 0.0063

本地主机 - - [03/Oct/2012:17:15:05 CEST] "GET /?loggedin=true HTTP/1.1" 200 3916

localhost:4567/login -> /?loggedin=true

4

1 回答 1

2

您的路线中有两个重定向'/buy_item';而在'/error'你不回来之后redirectredirect对您的 HTTP 标头执行某些操作,最好在调用后返回,即在路由/buy_item/error

-redirect '/login' unless session[:name]
+unless session[:name]
+  redirect '/login'
+  return nil
+end

我在一个大型的 Sinatra 应用程序上工作过,重定向有很多问题,上面的补丁应该会有所帮助。此外,我建议您查看HTTP RFC并熟悉Post-Redirect-Get 方案。要使用自定义状态代码进行重定向,您可以执行redirect '/foo', 303.

于 2012-10-03T21:09:58.837 回答