使用DELETE而不是GET删除后重定向Rails

Sin*_*hot 18 redirect routes ruby-on-rails http-delete

我有一个我发布的路线DELETE:

user_authorization_path(@user, authorization)
Run Code Online (Sandbox Code Playgroud)

它命中我的控制器,控制器删除资源,然后发出重定向:

redirect_to edit_user_path(params[:user_id])
Run Code Online (Sandbox Code Playgroud)

结果是重定向路由错误:

ActionController::RoutingError (No route matches [DELETE] "/users/1/edit")
Run Code Online (Sandbox Code Playgroud)

我可以在日志中看到rails正在做正确的事情,直到重定向,它试图发出另一个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")
Run Code Online (Sandbox Code Playgroud)

Chrome调试程序会显示初始请求:

Request URL:http://localhost:3000/users/1/authorizations/12
Request Method:DELETE
Status Code:302 Found
Run Code Online (Sandbox Code Playgroud)

以及它的重定向:

Request URL:http://localhost:3000/users/1/edit
Request Method:GET
Status Code:404 Not Found
Run Code Online (Sandbox Code Playgroud)

所以这似乎是浏览器正确地遵循重定向,但是rails忽略了GET重定向调用,而是DELETE在404中使用了哪个结果(因为DELETE该资源不支持 - 这无论如何都是错误的).

如果我只是在重定向的URL上执行'GET',它就可以正常工作.

关于Rails删除后的重定向我错过了什么?谢谢.

Ham*_*pei 24

这应该以更好的方式解决它:

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

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

如果您使用GET或POST以外的XHR请求并在请求后重定向,则某些浏览器将使用原始请求方法跟踪重定向.这可能会导致不良行为,例如双重DELETE.要解决此问题,您可以返回303参见其他状态代码,使用GET请求将遵循该状态代码.

  • 您可以使用 **:see_other** 而不是 **:303**。我认为它更具可读性。 (2认同)