私のコントローラーには次のものがあります
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