ruby-on-rails - 删除不存在的资源是否应该在 RESTful Rails 中导致 404?

标签 ruby-on-rails ruby http rest usability

在带有脚手架 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/

相关文章:

javascript - Node.js 表单数据最终去了哪里?

http - TCPCatcher : send HTTP request from hook

ruby-on-rails - 带有返回语句的 block 上的 Ruby 产量不一致

ruby-on-rails - 为什么我会收到从 ASCII-8BIT 到 UTF-8 的字符串编码问题 "\xE2"?

ruby-on-rails - Ruby/Rails 中 CIDR 的 IP 范围?

ruby - 模式类似于高亮括号模式,但在 ruby​​(def end) (do end) 中高亮关键字对

ruby-on-rails - PG gem 不会安装在 Rails 应用程序中:Gem::Ext::BuildError: ERROR: Failed to build gem native extension

javascript - 在Jquery代码Rails中使用Link_to

ruby-on-rails - 从 activerecord 中的组中选择最小值

ios - NSXMLParser 不工作