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

Posted

技术标签:

【中文标题】使用 DELETE 而不是 GET 删除后 Rails 重定向【英文标题】:Rails Redirect After Delete Using DELETE Instead of GET 【发布时间】:2013-01-13 22:56:33 【问题描述】:

我有一条路线,我正在发出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,而是使用了导致 404 的DELETE(因为该资源不支持DELETE - 无论如何这是错误的)。

如果我只是对重定向的 URL 执行“GET”,它就可以正常工作。

删除后 Rails 的重定向缺少什么?谢谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

比改变路线好多了。至少有人阅读文档。谢谢! 您可以使用 :see_other 代替 :303。我认为它更具可读性。

以上是关于使用 DELETE 而不是 GET 删除后 Rails 重定向的主要内容,如果未能解决你的问题,请参考以下文章

QEMU 的 UART 驱动程序接收“删除”字节而不是“退格”

Chrome 中的 AJAX 发送选项而不是 GET/POST/PUT/DELETE?

使用 HTTP post 方法而不是 DELETE 是不是有任何危害

为啥我把 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发

为啥保留/释放而不是新/删除?

postgresql数据库使用DELETE命令删除数据后,空间是不是立即自动释放?