Rails 4 - 更新的PATCH或POST更好

时间:2016-01-07 21:39:02

标签: ruby-on-rails ruby-on-rails-4 post

我正在使用电子商务风格应用程序的标准购物车。在购物车中,我们有标准流程允许用户更新商品的数量。我理解如何使用标准的post方法将信息传递给控制器​​中的动作。我不知道动词 PATCH PUT

如果我的控制器(通过POST调用)中的下一个自定义操作是PATCH,则使用标准操作,如"更新"认为更安全? 我还在学习更多有关rails和PATCH的知识,PUT对我来说有点混乱。

carts_controller

def update_cart_qty
  @item = Item.find(params[:line_item][:item_id])
  quantity = params[:line_item][:quantity]

  # if qty is a not a number or negative set to 1 
  quantity = '1' if !quantity.match(/^\d+$/)

  if quantity == '0'
    result = current_cart.line_items.where("item_id = ?", params[:line_item][:item_id]).destroy_all
    respond_to do |format|
        format.js {flash.now[:notice] = "Removed \"#{@item.title}\" from your cart."}
        format.html {flash[:error] = "Removed \"#{@item.title}\" from your cart."}
    end
  else
    result = current_cart.add_item_and_update(@item, quantity, branch, current_user, price)
    current_cart.save
    respond_to do |format|
        format.js {flash.now[:notice] = "Qty \"#{quantity}\" of item \"#{@item.title}\" was updated."}  
        format.html {flash[:notice] = "Qty \"#{quantity}\" of item \"#{@item.title}\" was updated."}
    end
  end
end  

1 个答案:

答案 0 :(得分:5)

jsonapi.org上的文档对PUT vs PATCH进行了很好的讨论。

  

HTTP规范不允许使用PUT部分更新资源(即仅更改其某些状态)。相反,PUT应该完全取代资源的状态。

     

[ snip HTTP spec blockquote ]

     

因此,部分更新的正确方法是PATCH,这是JSON API使用的方法。并且因为PATCH也可以用于完全资源替换,所以到目前为止,JSON API不需要为PUT定义任何行为。但是,它可能会在将来定义PUT语义。

     

过去,许多API使用PUT进行部分更新,因为PATCH尚未得到很好的支持。但是,几乎所有客户端现在都支持PATCH,而那些不支持PATCH的客户端可以轻松解决。

基本思想是PUT只应在完全替换资源时使用,PATCH应该用于部分替换/更新。 POST可用于任何非幂等操作。