[英]Ruby, Sinatra DELETE method
我正在使用 Sinatra 编写 Shop。 我实现了添加到篮子,但无法从篮子中删除。
我的 class 应用程序:
get "/basket" do #working
products_in_basket = FetchBasket.new.call
erb :"basket/show", locals: { basket: products_in_basket }
end
post "/basket" do #working
AddToBasket.new(params).call
redirect "/"
end
delete "basket/:id" do # doesn't work
DeleteBasket.new(params).call
redirect "/"
end
我的删除篮:
module Shop
class DeleteBasket
attr_reader :product_id, :id
def initialize(params)
@id = params.fetch("id").to_i
@product_id = params.fetch("product_id").to_i
end
def call
basket = FetchBaskets(id) # finds Basket instance with given id
return unless basket
reduce_basket_quantity(basket)
def reduce_basket_quantity(basket)
if basket.quantity >= 1
basket.quantity -= 1
#warehouse = FetchWarehouseProduct.new.call(product_id)
#warehouse.quantity += quantity
else
BASKET.delete(basket)
end
end
end
end
end
在视图中删除:
<td> <form action="/basket/<%=b.id%>" method="post">
<input type="hidden" name="_method" value="delete">
<input type="hidden" name="product_id" value=<%= b.product_id %>>
<input type="hidden" name="id" value=<%= b.id %>>
<button type="submit">Delete</button>
</form>
它没有按应有的方式重定向到主页,也没有将购物篮数量更改 1。它什么都不做。
我认为最明显的原因是您不是在调用delete
http方法,而是post
:
<form action="/basket/<%=b.id%>" method="post">
通常,您可以使用
<form action="/basket/<%=b.id%>" method="delete">
但这根据此答案尚不支持。
我认为您最好的选择是将delete
路线定义为post
post "delete-basket/:id" do
DeleteBasket.new(params).call
redirect "/"
end
然后写
<form action="/delete-basket/<%=b.id%>" method="post">
记住我们是怎么说的,在 HTML 表单中,我们可以指定应该用于发出请求的 HTTP 动词,如下所示:
<form action="/monstas" method="post">
...
</form>
这使得表单 POST 到 /monstas,而不是默认的 GET。
现在,可以公平地说,世界上每个理智的人都希望也可以发出 PUT 或 DELETE 请求。 像这样:
<form action="/monstas" method="delete">
...
</form>
除了……不是。 今天的浏览器仍然不允许使用 GET 和 POST 以外的任何其他动词发送 HTTP 请求。
2015 年情况仍然如此的原因要么令人着迷,要么令人悲伤,这取决于你如何看待它 [1] 但现在我们只需要接受它并解决它。
因此,Sinatra(以及 Rails 和其他框架)支持“伪造”请求,使其看起来像是应用程序端的 PUT 或 DELETE 请求,即使实际上它们都是 POST 请求。
这是通过向表单添加隐藏的表单输入标签来实现的,如下所示:
<input name="_method" type="hidden" value="delete" />
资料来源: https://webapps-for-beginners.rubymonstas.org/resources/fake_methods.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.