前提
課題でECサイトのケーキ屋ショッピングサイトを作成しています。
以下エラー文とコードです。エラー解決のためによろしくお願いします。
実現したいこと
- カート内の商品を空にする機能の実装(カートの商品をすべて削除する)を実現したいです。
発生している問題・エラーメッセージ
NoMethodError in CartItems#index undefined method `destroy_all' for "/cart_items":String
該当のソースコード
ruby/cart_item/index_html.erb
1 <%= link_to "カートを空にする", cart_items_path.destroy_all, method: :delete, 2 "data-confirm" => "本当に空にしますか?" %><br>
ruby/cart_items_controller.rb
1 def destroy_all 2 CartItem.destroy_all 3 current_customer.cart_item.destroy_all 4 redirect_to cart_items_path, notice: 'カートが空になりました。' 5 end
試したこと
コントローラーの定義をカリキュラムや検索をしてていぎしてみました。
が、エラーの解決には至りませんでした。
補足情報(FW/ツールのバージョンなど)
ruby/cart_items/index_html.erb
1<h1>お客様カート</h1> 2<div> 3 <table> 4 <thead> 5 <tr> 6 <th>商品画像</th> 7 <th>商品名</th> 8 <th>単価(税込)</th> 9 <th>数量</th> 10 <th>小計</th> 11 <th></th> 12 </tr> 13 </thead> 14 <tbody> 15 <% @cart_items.each do |cart_item| %> 16 <tr> 17 <td><%= image_tag cart_item.item.get_item_image(100,100) %></td> 18 <td><%= cart_item.item.name %></td> 19 <td><%= cart_item.item.with_tax_price %>円</td> 20 <td><%= cart_item.amount %></td> 21 <td><%= cart_item.subtotal %>円</td> 22 <td><%= link_to "削除", cart_item_path(cart_item.id), method: :delete, "data-confirm" => "本当に削除しますか?" %></td> 23 </tr> 24 <% @total += cart_item.subtotal %> 25 <% end %> 26 </tbody> 27 </table> 28 <p>合計金額(税込)<%= @total %>円</p> 29 <%= link_to "買い物を続ける", items_path %><br> 30 <%= link_to "カートを空にする", cart_items_path.destroy_all, method: :delete, 31 "data-confirm" => "本当に空にしますか?" %><br> 32</div>
ruby/cart_items_controller.rb
1class CartItemsController < ApplicationController 2 def index 3 @cart_items = CartItem.all 4 @items = Item.all 5 @cart_item = @items.all 6 #合計金額の初期値は0円 7 @total = 0 8 end 9 10 11 def create 12 @cart_item = CartItem.find_by(item_id: params[:cart_item][:item_id]) 13 if @cart_item 14 #カートにitemが存在したらamountに新しいCart_itemのamountを足す 15 @cart_item.amount += CartItem.new(cart_item_params).amount 16 else 17 #カートにitemが無ければ新しく作成する 18 @cart_item = CartItem.new(cart_item_params) 19 end 20 #ログインcustomerのみ更新できるようにするため分岐の外に記述する 21 @cart_item.customer_id = current_customer.id 22 @cart_item.save! 23 redirect_to cart_items_path 24 end 25 26 27 def update 28 @cart_item = current_customer 29 @item = Item.all 30 @cart_item.update(cart_item_params) 31 redirect_to cart_items_path 32 end 33 34 def destroy 35 @cart_item = CartItem.find(params[:id]) 36 @cart_item.destroy! 37 redirect_to cart_items_path 38 end 39 40 def destroy_all 41 CartItem.destroy_all 42 current_customer.cart_item.destroy_all 43 redirect_to cart_items_path, notice: 'カートが空になりました。' 44 end 45 46 private 47 def cart_item_params 48 params.require(:cart_item).permit(:item_id, :amount) 49 end 50end
ruby/items_controller.rb
1class ItemsController < ApplicationController 2 def index 3 @items = Item.all 4 @genres = Genre.all 5 end 6 7 def show 8 @item = Item.find(params[:id]) 9 @cart_item = CartItem.new 10 end 11 12 def item_params 13 params.require(:item).permit( 14 :name, :item_image, :introduction, :item_price, :genre_id) 15 end 16end
追記▼
ruby/routes.rb
1Rails.application.routes.draw do 2 3 devise_for :admin, skip:[:registrations, :passwords] ,controllers: { 4 sessions: "admin/sessions" 5 } 6 7 get '/' => 'homes#top' 8 get '/about' => 'homes#about' 9 #customer用itemのパス 10 resources :items, only: [:index, :show] 11 namespace :admin do 12 get '/' => 'homes#top' 13 14 resources :items, only: [:new, :create, :index, :show, :edit, :update] 15 resources :genres, only: [:index, :edit, :create, :update] 16 end 17 18 #顧客用 19 devise_for :customers,skip: [:passwords], controllers: { 20 registrations: "public/registrations", 21 sessions: 'public/sessions' 22 } 23 24 #顧客情報関連 25 get '/customers/my_page' => 'customers#show' 26 get '/customers/infomation/edit' => 'customers#edit' 27 patch '/customers/infomation/up_date' => 'customers#update' 28 get '/customers/unsubscribe' => 'customers#unsubscribe' 29 patch '/customers/withdraw' => 'customers#withdraw' 30 #カート関連 31 32 delete '/cart_items/destroy_all' => 'cart_items#destroy_all', as: 'destroy_all_cart_items' 33 resources :cart_items, only: [:index, :update, :destroy, :create] 34 # 管理者用 35 36 # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html 37end 38
ruby/cart_items_html.erb変更しました
1 <%= link_to "カートを空にする", destroy_all_cart_items_path, method: :delete, "data-confirm" => "本当に空にしますか?" %><br>
回答2件
あなたの回答
tips
プレビュー