当销毁一条记录时,我应该呈现什么?

43

我有一个API可以让你销毁一个对象。但是我不确定在记录被销毁后应该呈现什么JSON数据。以下是一些选项,但我不确定哪种最佳实践。

版本1:

返回204状态下的空对象。

def destroy
  item = current_user.current_cart.items.find(params[:id])
  item.destroy
  render json: {}, status: :no_content
end

版本 2:

即使物品已经被破坏,也可以退货。

def destroy
  item = current_user.current_cart.items.find(params[:id])
  item.destroy
  render json: item
end

这两者之间是否有偏好?是否有我没想到但可能更受欢迎的版本?

2个回答

36

对于删除请求,HTTP状态码为200或204表示资源已成功删除。

9.7 删除

如果响应包括描述状态的实体,则成功的响应应该是200(OK),如果尚未执行操作,则为202(已接受),如果操作已执行但响应不包括实体,则为204(无内容)。

因此,您可以使用200状态代码返回对象,也可以使用204状态代码返回空响应。


当你说空响应时,是指""、nil还是{}.to_json? - Peter Brown
1
你可以返回 "" 或者返回一条消息,表示 "删除成功"。 - usha

33

204成功状态(无内容)是合适的。正如204所暗示的,不能有响应主体,可以通过render :nothing, status: :no_content或更为引人注目的方式实现:

def destroy
  item.destroy
  head :no_content
end

编辑:render :nothing已经被弃用并在Rails 5.1中被删除。 相反,您可以使用 render body:nil,status::no_content


由于问题是关于哪种选择是适当的,而不是如何实现一种方式,在同一时间内,响应可以不为空且状态可以为:no_content。我建议使用@usha的方法。两者都表达了相同的意思,但这个更直接地回答了哪种选择。 - Paulo Felipe Souza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接