Ruby on Rails ショッピングカート part5 カートの仕上げ

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

  1. メソッド追加
     まずは「カートを空にする」を実装する。
    
    1. /app/controllers/store_controller.rb
       def empty_cart
         find_cart.empty!
         flash[:notice] = 'カートが空になりました'
         redirect_to(:action => 'index')
       end
      
  2. クラスメソッド追加
    1. /app/models/cart.rb
       def empty!
         @items = []
         @total_price = 0.0
       end
      
  3. 「カートを空にする」実行
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/148_01_empty_cart.jpg
  4. 「カートを表示する」実行
     ちゃんとカートが空になっている!!
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/148_02_display_cart.jpg
  5. 重複 redirect_to_index()メソッドとして抽出
     redirect_to(:action => 'index') というのがコントローラー内に3箇所ある。
     この共通のコードは、application.rb に追記する。
    
    • /app/controllers/store_controller.rb 変更前
        flash[:notice] = '無効な商品です'
        redirect_to(:action => 'index')
      
        flash[:notice] = '現在、カートには商品が入っていません'
        redirect_to(:action => 'index')
      
        flash[:notice] = 'カートが空になりました'
        redirect_to(:action => 'index')
      
    • /app/controllers/store_controller.rb 変更後
        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
        end
      
        def empty_cart
          find_cart.empty!
          redirect_to_index('カートが空になりました')
        end
      
    1. /app/controllers/application.rb
       private
       def redirect_to_index(msg = nil)
         flash[:notice] = msg if msg
         redirect_to(:action => 'index')
       end
      
  6. 重複 Cartモデルクラスにも全く同じコード
    • /app/models/cart.rb 変更前
        def initialize
          @items = []
          @total_price = 0.0
        end
      
        def empty!
          @items = []
          @total_price = 0.0
        end
      
    • /app/models/cart.rb 変更後
        def initialize
          empty!
        end
      
        def empty!
          @items = []
          @total_price = 0.0
        end
      
  7. 金額の表示を修正する
     小数点2位が0の場合、今までは「59.90」と表示せずに「59.0」と表示していた。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/148_03_sprintf.jpg
     単純に <td align="right"><%= item.unit_price %></td> を
     <td align="right"><%= sprintf("$%0.2f", item.unit_price) %></td> と
     修正すれば良いが、何箇所も修正する必要があるので、これも共通化。
    
  8. ヘルパーの利用
     ヘルパーは自動的にビューにincludeされるので、今回はここに記述する。
     また、金額の表示はアプリケーション全体に関してなので、
     application_helper.rb に記述。
    
    1. /app/helpers/application_helper.rb
       module ApplicationHelper
         def fmt_dollars(amt)
           sprintf("$%0.2f", amt)
         end
       end
      
  9. ビューの変更
     上記の修正に伴い、ビューも変更する。
    
    1. /app/views/store/display_cart.rhtml 以下の3箇所にfmt_dollars()メソッドを追加
       <td align="right"><%= fmt_dollars(item.unit_price) %></td>
       <td align="right"><%= fmt_dollars(item.unit_price * item.quantity) %></td>
       <td id="totalcell"><%= fmt_dollars(@cart.total_price) %></td>
      
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/148_04_after_sprintf.jpg
  10. index.rhtml にも金額を表示する部分があった!!
     これも修正したいと思う。
     修正前、後の画面は同じなので載せないよ。
    
    • /app/views/store/index.rhtml 修正前
        <span class="catalogprice"><%= sprintf("$%0.2f", product.price) %></span>
      
    • /app/views/store/index.rhtml 修正後
        <span class="catalogprice"><%= fmt_dollars(product.price) %></span>
      
  11. 補足 カートの金額
     カートの金額はその商品を買った時点を参照している。
     だから商品を買った後に、管理画面で金額修正をしても
     その次に同じ商品を買ったとしても金額が異なる。
    
     ※金額修正
     「5.56」→「5.50」
    
     同じ商品だが、金額が「5.50」。これをクリック。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/148_05_edit_price.jpg
     カート内容では、以前金額の掛け算になっている。
    
    • http://www.bishounen.sakura.ne.jp/rails/images/knowledge/148_06_edit_price_cart.jpg

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