在带有脚手架 RESTful 模型的全新 Rails 应用程序中,生成的删除代码如下所示:
class BeersController < ApplicationController
# DELETE /beers/1
# DELETE /beers/1.xml
def destroy
@beer = Beer.find(params[:id])
@beer.destroy
respond_to do |format|
format.html { redirect_to(beers_url) }
format.xml { head :ok }
end
end
end
如果用户尝试两次删除同一个 Beer(可能是快速双击,或在两个不同的浏览器选项卡中执行操作),他们将收到 RecordNotFound 错误,从而导致 404 页面。这是一种非常不友好的体验;似乎最好完成重定向回 beers_url
无论如何,可能会出现 flash
错误,因为对于第二个用户实际上无能为力删除失败。
另一种方法是像这样删除成功:
def destroy
@beer = Beer.find_by_id(params[:id])
destroyed = @beer.try(:destroy)
respond_to do |format|
format.html { redirect_to(beers_url) }
format.xml { destroyed ? head(:ok) : head(:not_found) }
end
end
我能理解在 API 用例中出现严重 404 错误的愿望,但我更难证明 Web 应用程序的合理性。谁能提供一个很好的理由,说明为什么我们应该以 RESTfulness 的名义向用户抛出一个可怕的错误?
(这个问题不是 Rails 特有的,但我不知道其他框架如何开箱即用地处理这种情况)。
最佳答案
更新:事实证明我错了:https://stackoverflow.com/a/24713946/14731
上一个回答:
HTTP DELETE
是一个 idempotent手术。连续多次调用它必须导致与第一次相同的行为。意思是:你不应该返回 HTTP 404。
关于ruby-on-rails - 删除不存在的资源是否应该在 RESTful Rails 中导致 404?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474223/