2016-09-22 10 views
0

私のアイテムに「カートに追加」メソッドを追加しようとしています。[GET]と一致するルートはありません

items_controller:

def to_cart 
    @item = Item.friendly.find(params[:id]) 
    @item.add_to_cart 
    redirect_to root_path 
end 

経路:

resources :items do 
    put :to_cart, on: :member 
end 

モデル:

def add_to_cart 
    current_user.cart.items << self 
    current_user.cart.save 
end 

ショー:

<%= @item.name %> 
<%= link_to 'add to cart', to_cart_item_path(@item) %> 

RoutingError:No route matches [GET] "/items/first/to_cart" フレンドリーなidのために「最初に」。 私は間違っていましたか?

+0

はあなたのroutes.rbをを追加することができます。

RailsのUJSドライバ(控えめなJavaScriptのドライバ)も、link要素がdata-method属性を持っている場合、クライアントでフォームを作成する方法を提供し? resources:items行に 'member::to_cart'を追加する必要があります。 –

答えて

1

それはGETとレールのデフォルトであなたのリンクでmethod: :putを追加し、ウェブ上で

<%= link_to 'add to cart', to_cart_item_path(@item), method: :put %> 
0

リンクのみGETリクエストを送信GET方法でルートを見つけようとしています。

POST/PUT/PATCH/DELETEリクエストを送信するには、フォームを使用する必要があります。

<%= form_for to_cart_item_path(@item), method: :put do |f| %> 
    <% f.submit 'Add to cart' %> 
<% end %> 

このショートカットはbutton_to('add to cart', to_cart_item_path(@item))です。

<%= link_to 'add to cart', to_cart_item_path(@item), method: :put %> 
+0

しかし、あなたのメソッドが安心しているか、HTTP動詞の意味論を適切に使用している場合は、非常に議論の余地があります。 PUT要求は、既存のリソースを変更または置換します。あなたがやっていることは、カートにリソースを追加することです。アイテムを変更しない。これは些細なように見えるかもしれませんが、かなり重要な意思決定です。 – max

関連する問題