20

我有一条要发布的路线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 的重定向缺少什么?谢谢。

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 请求并在请求之后进行重定向,则某些浏览器将使用原始请求方法跟随重定向。这可能会导致不良行为,例如双重删除。要解决此问题,您可以返回 303 See Other 状态代码,随后将使用 GET 请求。

于 2014-02-19T13:47:51.953 回答