2016-07-12 10 views
0

Ich schreibe Shop mit Sinatra. Ich habe das Hinzufügen zum Warenkorb implementiert, aber ich kann das Löschen aus dem Warenkorb nicht durchführen.Ruby, Sinatra DELETE Methode

Meine Klasse App:

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 

Mein DeleteBasket:

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 

in Aussicht Löschen:

<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> 

Es ist nicht zur Startseite nicht umleiten, wie es sollte, und es ändert die Warenkorbmenge nicht um 1. Es tut einfach nichts.

+0

Welche ORM schreiben verwenden Sie? –

+0

Klassen sollten Substantive sein, Methoden sollten Verben sein, die sich mit diesen Substantiven befassen. Es macht keinen Sinn, eine Klasse namens "DeleteBasket" zu haben. Was genau funktioniert nicht? Ihre 'DeleteBasket'-Klasse ist sogar syntaktisch falsch. –

+0

Was ist syntaktisch falsch? – Jes

Antwort

0

ich offensichtlichste Grund denken, wird Sie nicht die delete http-Methode aufrufen, aber post statt:

<form action="/basket/<%=b.id%>" method="post"> 

Normalerweise würde man dies beheben, indem

<form action="/basket/<%=b.id%>" method="delete"> 

verwenden, aber das ist noch nicht unterstützt nach this answer.

Ich denke, Ihre beste Wette ist Ihre delete Route als post

post "delete-basket/:id" do 
    DeleteBasket.new(params).call 
    redirect "/" 
    end 

zu definieren und dann

<form action="/delete-basket/<%=b.id%>" method="post">