我们看到上一篇最后的图,当我们点击一下书籍后面的“Add to Cart”按钮时,session页面会添加一个书名。现在我们让它更加完善,购物车的显示格式为书籍的数目乘以书籍的名字来表示我们买了几本书。
我们新建一个模型类(model),CartItem,包含了书籍的名字与数目。
app/models/cart_item.rb
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
我们要在Cart类的add_product()方法中使用这个新建的模型类。首先去查看现有的物品列表中室友已经存在即将加入的这种货物,如果有,数目+1,否则添加一个CartItem对象。
app/models/cart.rb
def add_product(product)
current_item = @items.find{|item| item.product == product}
if current_item
current_item.increment_quantity
else
@items << CartItem.new(product)
end
end
add_to_cart页面也做下小小的改变。
app/views/store/add_to_cart.html.erb
<h1>Your Pragmatic Cart</h1>
<ul>
<% for item in @cart.items %>
<li><%= item.quantity %> × <%=h item.title %></li>
<% end %>
</ul>
开启服务器,添加一本书籍进去看看。

我们看到了一个难堪的页面。为什么呢?因为我们前后的session发生的变化,以前的session直接把货物放进@item数组,所以当rails从session中取出这个购物车之后,里面装的都是Product对象,而不是CartItem对象。
我们去删除旧的session
在depot目录下面
>rake db:sessions:clear
刷新,看到了我们想要的结果了。
