簡體   English   中英

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

[英]Rails Redirect After Delete Using DELETE Instead of GET

我有一個路由我發布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刪除后的重定向我錯過了什么? 謝謝。

這應該以更好的方式解決它:

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

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

如果您使用GET或POST以外的XHR請求並在請求后重定向,則某些瀏覽器將使用原始請求方法跟蹤重定向。 這可能會導致不良行為,例如雙重DELETE。 要解決此問題,您可以返回303參見其他狀態代碼,使用GET請求將遵循該狀態代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM