繁体   English   中英

Ruby, Sinatra DELETE方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM