Sin*_*hot 18 redirect routes ruby-on-rails 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该资源不支持 - 这无论如何都是错误的).
如果我只是在重定向的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请求将遵循该状态代码.
| 归档时间: | 
 | 
| 查看次数: | 4893 次 | 
| 最近记录: |