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

何もリダイレクトされていません。localhost:4567 / error/error.erbを直接呼び出すと、リダイレクトされません。

ログは次のとおりです。

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-> / 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 = true

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] "GET / error 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-> / error

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

4

1 に答える 1

2

ルート内に2つのリダイレクトがあります'/buy_item'; そして、'/error'あなたは。の後に戻ってこないredirectredirectHTTPヘッダーに何かを行うので、呼び出し後に戻ることをお勧めします。つまり、両方のルート/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 に答える