刘华佼的全栈学习记录

5-13 url: cart_item_path(cart_item.product_id)是什么意思?

| Comments

1、拆分

想了解整句的意思,先分拆成

  • url
  • cart_item_path
  • cart_item.product_id

2、逐一破解

2.1 url

url即统一资源定位符Uniform Resource Locator,是一个网络地址。

2.1 cart_item_path

cart_item_path,可以打开http://localhost:3000/rails/info/routes

或者在iTerm里输入:

rake routes


就找到了cart_item_path对应的url是:/cart_items/:id(.:format)

注意:/cart_items/:id(.:format)这里有个变量:id。

2.3 cart_item.product_id

这句话,我们直接找db/schema.rb文件,找cart_items表单里的内容,发现它有一个product_id:

cart_item.product_id里的cart_item是单数,所以可以理解为cart_items(复数,表示所有cart_item的集合)中某个特定的cart_item。cart_item.product_id就是这个特定的cart_item的product_id。

综合理解

综上,我们现在知道了:

  • url对应一个网址;
  • cart_item_path对应的url是:/cart_items/:id(.:format);
  • cart_item.product_id就是这个特定的cart_item的product_id。

所以可以推理:url: cart_item_path(cart_item.product_id)是网址/cart_items/:id,而这里的:id是不确定的,要靠(cart_item.product_id)来确定。

从已知到未知——从实际网页代码对应到view代码

好,下一步,学习东西要从已知到未知。

我们要看url: cart_item_path(cart_item.product_id)这个出自哪里,然后用实际的例子观察一下这条语句在网页/服务端是如何对应的。

在购物网站教材中搜,发现它出自6-1 购物车练习作业 (解答)

点击进去,先复制url: cart_item_path(cart_item.product_id)这条语句,然后Command+F打开当前页面的搜索框,Command+V粘贴到搜索框里,按return键,查找到这条语句在购物车的主页(即app/views/carts/index.html.erb):

那就试着打开购物车主页:http://localhost:3000/carts,鼠标在这个主页里随意点击一下(不要点击到链接),然后Command+Option+I打开Google的Inspect调试器,不喜欢用快捷键,就在页面右键单击,弹出菜单,选中“Inspect”:

在Inspect界面里,Commad+F调出搜索框,输入“更新”,然后找到有“更新”字样的那一行代码,我们的目标区域是“更新”行的上面、<td>下面的那部分代码。

为什么呢?这里有个小技巧,就是要在页面中要找到url: cart_item_path(cart_item.product_id)对应的代码很难,所以需要根据url: cart_item_path(cart_item.product_id)前后的明显标志物来定位它的位置。

就像你要找在某个星巴克/沙县小吃跟人碰面,这个星巴克/沙县小吃在天安门附近,你会先找到天安门,然后再找天安门附近的星巴克/沙县小吃。文本“更新”就是天安门一样的标志物。

还有一种方法找,就是Command+Shift+C打开工具“选择元素”,或者单击“选择元素”工具小图标,然后鼠标移动到网页里的“更新”按钮上方:

同样,目标区域在这段代码上方。

找到实际网页代码与view里源代码的关系后:

好了,现在目标区域已经缩得非常小了,只有几行代码,在这几行代码里,用大脑匹配下有没有/cart_items/cart_item.product_id这样的模式,或者简化为“/cart_items/数字”这样的模式(因为id通常是一个数字),很幸运我们找到了:

那么这个1到底是怎么来的呢?既然由cart_item.product_id确定,那不妨看看,是不是这个product的id。

那么问题来了,为什么不直接用product_id,而要用cart_item.product_id呢?这说明cart_items应该有一个与products和carts对应关系。所以我们可以去找cart_items最初是怎么定义的。



这几张图片就说明了它们之间的关系。

可以这样理解:

carts代表城市,cart_items代表市民,某个特定的cart_item代表马云。
carts里装cart_items,城市里住着许多市民;
cart_item是cart_items中特定的一个,马云是市民中特定的一个人;

马云有一些东西,比如马云有一台Mac电脑,一个水杯,一盏台灯;
Mac电脑,一个水杯,一盏台灯这些都属于products;
Mac电脑是products中特定的一个product;

马云的Mac有个编号,编号就是id,用特定的product_id表示,
马云的Mac电脑的id,即马云.Mac电脑的id,就可以用cart_item.product_id来定位。

至此,可以理解了url: cart_item_path(cart_item.product_id)的意思了:
就是路径:/cart_items/你当前更新操作的cart_item对应的产品id

备注:

cart跟cart_item是两回事,cart_item 也可以叫tobuy_things、tobuy_products、like_them等等,随便命名,但命名后就不能改了。

Comments

comments powered by Disqus