我正在使用电子商务风格应用程序的标准购物车。在购物车中,我们有标准流程允许用户更新商品的数量。我理解如何使用标准的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
答案 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可用于任何非幂等操作。