読者です 読者をやめる 読者になる 読者になる

生涯未熟

プログラミングをちょこちょこと。

RailsによるアジャイルWEBアプリケーション開発第3版勉強!#7

前回はカートアプリケーションの作成し、ブラウザ上に表示するところまできました。
今回は前回ではまだまだ不完全だったところを改良していきたいと思います。


・数量の調整


まず前回の部分で指摘した問題点は数量の表示の問題です。
同じ商品の名前がずらっと同じ行にあるのはあまりスマートとは言えません。
そこで、表示を数量×商品の名前という風にしたいと思います。


新しいモデルapp/models/cart_item.rbを作成し商品情報のproductと数量のquantityを関連付けます。

class CartItem

 attr_reader :product, :quantity
 def initialize(product)
  @product = product
  @quantity = 1
 end 

 def increment_quantity
  @quantity += 1
 end

 def title
  @product.title
 end

 def price
  @product.price * @quantity
 end
end

attr_readerでproductとquantityを参照し、initialize(product)メソッドで引数としてproductを与えるとインスタンス変数productには引数を、インスタンス変数quantityには1を代入する。

次に、increment_quantityメソッドはインスタンス変数quantityをインクリメントしています。
titleメソッドとpriceメソッドの中でインスタンス変数の後に.が付いていますがこれは何でしょう?
ここら辺もRubyを勉強していないので分からないという・・・



とりあえず次にapp/models/cart.rbを改良しましょう。

 def add_product(product)
  current_item = @item.find {|item| item.product == product }
  if current_item
        current_item.increment_quantity
  else
        @items << CartItem.new(product)
  end
 end


商品追加のメソッドの改良です。
現在のカートの商品に重複があるかどうかチェックし、あった場合は数量をインクリメント、なかったらカートに新しい商品として放り込む感じのメソッドです。


またこれに関するビューにも手を加えましょう。
ファイルはapp/views/store/add_to_cart.html.erbです

<h2>Pragmaticカート</h2>
<ul>
 <% for item in @cart.items %>
  <li><%= item.quantity %> &times; <%=h item.title %></li>
 <% end %>
</ul>


カート内のアイテムを数と×で乗算記号、そしてタイトルという順で表示させるようになっています。



これで完成・・・かな?というわけでブラウザを更新してみましょう!



出来てない・・・orz
ふむ、とりあえず今までのセッションを破棄してみましょう。

> rake db:sessions:clear

そして、カートに入れるボタンを再び押してみると・・・・





おぉ!いけました!





今回はここまで。
今回でこの連載は少しお休みさせていただきます。
この連載はRubyを勉強したのちまた始めさせていただきたいと思います。