Day 28 Rails shallow nesting

阿修说文解字

甚麽是 shallow nesting?

shallow nesting 是用来把路径(也就是我们的网址)缩短的技巧。

为什麽要用 shallow nesting?

在 Rails 的 model 内常常会有 belongs_to、has_many 的关联。
假设我现在要做一个笔记留言的路径,因为 note has_many :comments、comment belongs_to :note,
所以假如我要删除2号笔记里面的3号留言,我的路径会是 /notes/2/comments/3。
不过因为留言的 id 不会跟别的留言重复的关系,其实就算不用去2号笔记内我也可以直接观看、编辑、删除3号留言,
为了让路径看起来比较不罗唆,这时候 shallow nesting 这个技巧就可以派上用场了!

从下图可以看到 index、new、create 的路径没有 id
这是因为 index 是要显示2号笔记的所有留言、new 是新建一个留言所需要的页面、而 create 是新建一个留言,
这三个都不需要有特定的 id。
而其他像是 show 要显示3号留言、edit 是编辑3号留言所需要的页面、update 要更新3号留言、destroy 要删除3号留言,都是需要特定的 id 才能够操作。

范例1(不使用 Rails 内建的 shallow nesting):

resources :notes do
  resources :comments, only: [:index, :new, :create]
end
resources :comments, only: [:show, :edit, :update, :destroy]

范例1会让 index、new、create 的路径维持 /notes/2/comments
而 show、edit、update、destroy 的路径变成 /comments/3
如此一来可以让路径看起来简洁一点。

范例2(使用 Rails 内建的 shallow nesting):

resources :notes do
  resources :comments, shallow: true
end

如果使用 Rails 内建的 shallow nesting,就可以有这个效果。
像是范例2在 resources :comments 後面加上 shallow: true 就可以直接变成范例1的效果,
是不是很方便呢!

参考:
[1]Rails Routing from the Outside In


<<:  [D28] 资料增强

>>:  【Day28】2次收敛除法器实作

Day01-认识环境

前言 很感谢各位进来观看本人的铁人赛,会想写关於JavaScript主题主要是学习了一段时间,透过参...

TypeScript 能手养成之旅 Day 10 物件型别-扩充型别-列举(Enum)

前言 上集我们介绍到 Enum 基础用法,今天将来讲解其它用法。 字串列举(String enum)...

【Day 16】for 回圈

在写程序时,我们可能需要重复执行某些程序,总不可能每行程序一直复制贴上,这时候就会用到我们的回圈(l...

Django #1-3 套件管理工具pip pipenv poetry

1. pip Python 原生套件管理工具 venv 虚拟环境 install python -m...

Day19 - 中场休息时间 - 怎麽样用Canvas精准的写出一个『字』 - 成为Canvas Ninja ~ 理解2D渲染的精髓

呃,首先呢~ 敝人小弟在下我今天仔细的思考了一下,决定这次还是再来一篇『中场休息』科普文,等到明天再...