购物网 二刷第二周进度 5.7
请设计一个功能,可以一键清空购物车内所有的物品
再次写对了routes, 开心~但是前端view以及controller的定义, 我就又乱来了...
不符合逻辑的部分是, 你都用
carts_path
这样"全体出动"的复数path, 后面根本不需要跟着"单个行动"才需配备的"指路locate"用的(@cart)
呀!
教程用current_cart
直接locate到此购物车, 不用像下面截图里我自己写的第一行那样去locate
嗯哼, 你想啊, 逻辑上来说也不能把cart删掉啊! 需求只是要删除"cart"里的"cart_items"们不是吗? 我那样写, 把用户的购物车都给端掉了...这也太狠了. 釜底抽薪式删除啊!
人家拿着购物篮, 想清空商品重新去挑选, 你却跑来把人家购物篮都给丢了...这绝对写错啊! 不但写错, 而且教程还嫌弃写一堆在controller太丑, 还去model定义了一部分...哼唧...
某样东西突然不想买了,我可以在购物车内删除它
真诚的困惑两者的区别...单数的cart
以及cart_items
他们区别何在啊...如果"购物车"用的path是carts_path
这样的index专用复数...cart这个单数的到底要如何自处...跟cart_items又是何种关系?
而这个需求应该是锁定某个cart_item
来操作对吧?
嗯, 对比教程发现果然有误, 而且method是直接写在
do
之前的位置...妈呀...认真看代码能领悟到, 应该细化到
cart_item.product_id
, 因为一个cart购物车里会有很多项的cart_item, 需通过product_id
来进一步locate到需要删除的特定商品.
顺便去写了写controller
嗯, 果然写错, 打脸如下
这样跟教程对比,真是很多地方遗漏了啊...
神奇的是这句 @cart_item = @cart.cart_items.find_by(product_id: params[:id])
明明是要定位"单数形式"的 cart_item
, 为啥后边定义的部分@cart.cart_items.find_by(product_id: params[:id])
里却用的是此cart里面全部的cart_items
这个复数名词?!
难到是因为要在"众多的" cart_items里, 搜索定位到拥有 "目标product_id
"的特定cart_item
所对应的 params[:id]
? 就是为locate到需要找的"商品相对应的cart_item"才这样写?! (感觉我应该推测的没错...我这厉害的领悟力哈哈哈)
这段代码在5月15日vedio里面有官方介绍, 7分钟开始!!!
已经加入购物车的物品,不能重复被加入
准备去product controller里面修改, 把add_to_cart
设定的严格一些. 但心里在困惑, 如何在product的controller里关联到 cart里是否有此product了? 联系到外部去了, 莫非用"@"即可以召唤外部数据来帮忙判断咩?
被打脸...
不是我那样直接连cart是谁都不定义清晰就用, 教程是用 current_cart 而且要在末尾点名道姓是"@product"
if !current_cart.products.include?(@product)
中间的products为啥是复数?!
估计也是之前我推测的理由, 要在"众多products
"中一一过滤最后locate到"目标product" 所以不能是"单数product". 要排查的范围为"已存在的products们", 不是单独一个product, 所以用复数.
还有, 不是用 present?
是用 include?
这两区别是?
可以更改购物车内购买的数量( 原本预设数量都是1)
记得只要给view就成, 剩下的都是现成的?
打脸来了, 不止要改view而已...Orz
然后因为用到了"更新"还要submit数据变化, 所以要去controller增加定义...Orz 不信你就点击更新试看看, 报错也会告诉你的...
教程来打脸, 这里没有错太多~ 惊讶...
库存为 0 的货品不能购买
嗯, 又没思路了...
瞄教程才想起来, 可以直接在view里面"断其后路"...但是自己试写有点怪
教程来打脸
教程担心的还挺多, 总之就是允许没有"具体数量"的商品也能上架咯~
然后要去修改controller的部分...我完全没想法...而且再一次以为要去product controller 里去修改add_to_cart
其实不对...应该要去cart_item controller改, 思路是这controller里的update定义要保障"更新quantity"的时候符合情况.
-
尝试解析一个难点
然后难点以及重点是这句代码 好好多看几遍 if @cart_item.product.quantity >= cart_item_params[:quantity].to_i
我自己写的话, 是会用"<="...看来没理解教程逻辑...
cart_item_params[:quantity]
应该是购物车里面想要"更新"的商品数量. 所以前半部分的 @cart_item.product.quantity
代表是库存的商品数量咯? 如果是这样理解才是对的, 那这句代码我能理解. 我一开始以为 @cart_item.product.quantity
代表的是购物车里的数量...难道不是吗?...Orz
莫非... if @cart_item.product.quantity >= cart_item_params[:quantity].to_i
想表达的意思是『"购物车里此商品目前的数量" 要大于或等于 "你想修改的商品数量"的数值』不对...应该还是 『"此商品目前的库存" 要大于或等于 "你想修改的此购物车里的商品数量"的数值』...好困惑...
你的困惑在5月15日vedio里面有官方解释, 7分钟开始!!! 你自己玩看看就知道了!!!
在购物车新增数量时,不能更新超过原有库存的数量
嗯, 改成1..cart_item.product.quantity
就搞定了. 原来 cart_item.product.quantity
还真就是"商品库存的数量"...回答了我前面的困惑...
而从这修改能看出来 cart_item.product.quantity
是个数值, 那为什么上一条的cart_item_params[:quantity]
的date type居然不是"数值"? 改改看看效果.
把.to_i
去掉, 就报错了, 原来 cart_item_params[:quantity]
的date type是string啊...Orz 觉得奇怪, 去看了一下表格结构
明明一开始的设定就是个integer啊...去看了cart_item的表格结构, 也一样
看了一下汇总的表格信息, 一致啊
莫非我推测没错? 因params是个string来的, 它旗下被它带上的"特征"们也会改变"自身一开始的设定"全部变string?