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

时间:2013-01-30 07:26:07

标签: ruby-on-rails redirect routes http-delete

我有一条路线{我发出DELETE

user_authorization_path(@user, authorization)

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

redirect_to edit_user_path(params[:user_id])

结果是重定向路由错误:

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

我可以在日志中看到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")

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

所以这似乎是浏览器正确地遵循重定向,但是rails忽略了重定向调用上的GET,而是使用DELETE导致404(从DELETE开始该资源不支持 - 无论如何都是错误的。)

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

删除后Rails的重定向错过了什么?感谢。

1 个答案:

答案 0 :(得分:24)

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

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

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

  

如果您正在使用GET或POST以外的XHR请求并重定向   在请求之后,一些浏览器将遵循重定向使用   原始请求方法。这可能导致不良行为   比如双DELETE。要解决这个问题,你可以返回303 See   使用GET请求将遵循的其他状态代码。