在带有支架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,但我不知道其他框架如何处理这种情况)。