在一个全新的Rails应用程序中,使用脚手架生成RESTful模型后,生成的删除代码如下:
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
如果用户尝试删除同一种啤酒两次(可能是快速双击或在两个不同的浏览器选项卡中执行操作),他们将收到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 应用程序来说很难为我提供充分理由。有人能够提供一个良好的理由吗,为什么我们应该以 RESTful 的名义向用户抛出可怕的错误?
(这个问题不特定于 Rails,但我不知道其他框架如何处理这种情况)。