20

私が発行しているルートがありますDELETE

user_authorization_path(@user, authorization)

コントローラーに問題なくヒットし、コントローラーはリソースを削除してから、リダイレクトを発行します。

redirect_to edit_user_path(params[:user_id])

この結果、リダイレクト時にルーティング エラーが発生します。

ActionController::RoutingError (No route matches [DELETE] "/users/1/edit")

ログを見ると、レールがリダイレクトまで正しいことを行っていることがわかります。リダイレクトは、次のDELETE代わりに別のものを発行しようとしていGETます。

Started DELETE "/users/1/authorizations/12"...
...
Redirected to http://localhost:3000/users/1/edit
Completed 302 Found in 8ms (ActiveRecord: 0.2ms)

Started DELETE "/users/1/edit"...

ActionController::RoutingError (No route matches [DELETE] "/users/1/edit")

Chrome デバッガーに最初のリクエストが表示されます。

Request URL:http://localhost:3000/users/1/authorizations/12
Request Method:DELETE
Status Code:302 Found

そして、リダイレクトの次のとおりです。

Request URL:http://localhost:3000/users/1/edit
Request Method:GET
Status Code:404 Not Found

したがって、これはブラウザがリダイレクトを正しくたどっているように見えますが、レールはGETリダイレクト呼び出しを無視し、代わりにDELETEwhich を使用して 404 を返します (DELETEそのリソースではサポートされていないため、とにかく間違っています)。

リダイレクトされた URL で単純に「GET」を実行すると、正常に動作します。

削除後のRailsのリダイレクトについて何が欠けていますか? ありがとう。

4

1 に答える 1

28

これにより、より適切な方法で修正されるはずです。

redirect_to edit_user_path(params[:user_id]), status: 303

http://api.rubyonrails.org/classes/ActionController/Redirecting.html

GET または POST 以外の XHR リクエストを使用し、リクエストの後にリダイレクトする場合、一部のブラウザーは元のリクエスト メソッドを使用してリダイレクトに従います。これにより、二重 DELETE などの望ましくない動作が発生する可能性があります。これを回避するには、GET リクエストを使用して追跡される 303 See Other ステータス コードを返すことができます。

于 2014-02-19T13:47:51.953 に答える