Ruby on Rails ショッピングカート part9_2 コントローラー見直し

Ruby on Rails において ショッピングカート とは以下を示します。

  1. コントローラー編集
     単にfind_cart()メソッドを変更して、find_cart()メソッドで
     カート内容を呼び出している。
     そのfind_cart()メソッドを全てのアクション前(indexは除く)に
     呼び出すようにする。また、いらない@cart = find_cart は削除
     するような流れ。
    
    • /app/controllers/store_controller.rb 変更前
        class StoreController < ApplicationController
      
          def index
            @products = Product.salable_items
          end
      
          def add_to_cart
            product = Product.find(params[:id])
            @cart = find_cart
            @cart.add_product(product)
            redirect_to(:action => 'display_cart')
          rescue
            logger.error("無効な商品 #{params[:id]} にアクセスしようとしました")
            redirect_to_index('無効な商品です')
          end
      
          def display_cart
            @cart = find_cart
            @items = @cart.items
            if @items.empty?
              redirect_to_index('現在、カートには商品が入っていません')
            end
            if params[:context] == :checkout
              render(:layout => false)
            end
          end
      
          def empty_cart
            find_cart.empty!
            redirect_to_index('カートが空になりました')
          end
      
          def checkout
            @cart = find_cart
            @items = @cart.items
            if @items.empty?
              redirect_to_index("カートに商品が入っていません!")
            else
              @order = Order.new
            end
          end
      
          def save_order
            @cart = find_cart
            @order = Order.new(params[:order])
            @order.line_items << @cart.items
            if @order.save
              @cart.empty!
              redirect_to_index('ご注文ありがとうございました')
            else
              render(:action => 'checkout')
            end
          end
      
          private
          def find_cart
            session[:cart] ||= Cart.new
          end
        end
      
    • /app/controllers/store_controller.rb 変更後
        class StoreController < ApplicationController
      
          before_filter :find_cart, :except => :index
      
          def index
            @products = Product.salable_items
          end
      
          def add_to_cart
            product = Product.find(params[:id])
            @cart.add_product(product)
            redirect_to(:action => 'display_cart')
          rescue
            logger.error("無効な商品 #{params[:id]} にアクセスしようとしました")
            redirect_to_index('無効な商品です')
          end
      
          def display_cart
            @items = @cart.items
            if @items.empty?
              redirect_to_index('現在、カートには商品が入っていません')
            end
            if params[:context] == :checkout
              render(:layout => false)
            end
          end
      
          def empty_cart
            find_cart.empty!
            redirect_to_index('カートが空になりました')
          end
      
          def checkout
            @items = @cart.items
            if @items.empty?
              redirect_to_index("カートに商品が入っていません!")
            else
              @order = Order.new
            end
          end
      
          def save_order
            @order = Order.new(params[:order])
            @order.line_items << @cart.items
            if @order.save
              @cart.empty!
              redirect_to_index('ご注文ありがとうございました')
            else
              render(:action => 'checkout')
            end
          end
      
          private
          def find_cart
            @cart = (session[:cart] ||= Cart.new)
          end
        end
      

ご訪問頂き有難う御座います。 当サイトを効率良く使うためにまずは FrontPage を見て下さい。 検索方法、一覧表示などの各情報を纏めています。
当サイトの説明 → Frontpage