6 months ago

目的:设计一台购物车Cart(Model),点击加入购物车按钮能够执行add_product_to_cart这个方法,把商品加到购物车里。

购物车(car))里有多个购物栏(cart_item),购物栏记载一个商品(product)和该商品的数量(quantity)。

第一部分:

产生cart 与 cart_item两个model,product通过cart_item存放到cart中。

在cart的model中定义add_product_to_cart方法

第二部分:

显示当前购物车内物品数量,透过current_cart.products.count拿到购物车内的物品数量。
为了要在view里面可以存取current_cart,得在applications_controller.rb宣告他是helper_method,才能直接存取。

在application_controller.rb中定义current_cart这个方法,如果current_cart是nil,那么呼叫find_cart这个函式去找到之前使用的购物车。

find_cart是通过session机制来找到之前的那辆购物车的,这种机制是用来在客户端与服务器之间保持状态的解决方案。

HTTP协议是无状态的,比如客户端向服务器产生的请求都是独立的,并且是没有被记录下来的,但是如果想要被记录下来某个区间的互动的话,就可以用到session机制,用来记录用户的状态,同时起到区别用户的作用。

所以教材中session[:cart_id] = cart.id(rails里定义session的用法)是当购物车在创建的那一刻,服务器就将一个随机生成的session_id放进了这辆购物车中,在下次打开页面时可以找到之前的购物车,而不用新建购物车,如果旧购物车丢失,那么在新建购物车时又要重新放进一个session_id。

那为什么不直接将购物车存储到数据库呢?为什么存在session里面(直接存在服务器里)?

一般记录状态的都存session,不直接存数据库。就像我们用的devise gem包,记录用户登录状态的也是存在session里面,这样存的好处是:一来不用去查询数据库,也不用浪费空间,二来可以设过期时间。

← 回呼callback 自动化测试归纳 →
 
comments powered by Disqus