noAh's Steps on Rails or sth. Else.

Whatever, keep going ahead.
  首页  :: 新随笔  :: 管理

AWDwR depot例程 A Smart Cart

Posted on 2008-10-31 11:12  noAh....  阅读(403)  评论(0)    收藏  举报

  我们看到上一篇最后的图,当我们点击一下书籍后面的“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 %> &times; <%=h item.title %></li>
<% end %>
</ul>
  

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