我有一条路线{我发出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的重定向错过了什么?感谢。
答案 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请求将遵循的其他状态代码。