はじめに
プログラミング初学者がつまずきやすい「ルーティングのネスト」について簡単に解説します。
思う通りにルーティングが実行が書けない。ルーティングの仕組みがそもそもよくわかっていない。という人はこの記事を読んで理解を深めていきましょう。

ルーティングって難しいんだよね・・・




みんながwebページを開いているときに表示されるURLに関わることだからとても重要なんだよ!
ルーティングとは
ルーティングとはroutingと英語で書き、
通信相手までの経路を判断する仕組み
を意味します。ネットワーク上で行われる道案内みたいなものです。
Railsでの通信の流れはだいたいこんな感じです。




もうちょっと分かりやすく
通常はここに行きたいという目的地がはっきりしているのですが、ネットワーク上は分岐点がたくさんあります。
そのままだとどの道を辿っていけばいいのか分からないのですが、ルーティングさんが分岐点でここに行きなさいと教えてくれるのです。








Railsの場合だと、ページを表示させるためのコントローラーのアクションまで案内してくれる。




どうやって書くんだっけ?
Ruby on the Rails でのルーティングの書き方
Railsでルーティングを記述する場合、routes.rbに記述します。
以下はtwitterのようなアプリを想定し、呟く機能を実装する例です。
Rails.application.routes.draw do
resources :tweets
end
resourcesメソッドを使うことで7つのアクション(index,new, show, create, update, edit, destroy)に至るルーティングを省略しています。
ルーティングのネストとは
ルーティングのネストとは、段階に分けてルーティングを記述することです。








おお!ルーティングさんが2人に増えたよ!




厳密には2人に別れる訳ではないんだけどね。
イメージとしては近いかな!
先ほどのtwitterのようなアプリに、呟く機能に加えてその呟きに対してコメントをする機能を実装する時のルーティングの記述例です。
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
tweetsコントローラへのルーティングの記述の中に、commentsコントローラへの記述が書かれています。こうすることによって、どのツイートに紐づいたコメントなのかをURLで判別できるようにしています。
ネストさせるメリット
ルーティングをネストさせることによって得られるメリットは関連付けです。
具体的に
- URLの階層構造ができる
ということです。
URLの階層構造ができる
ルーティングの記述をネストさせるとURLの階層構造ができます。
先ほどのコードをもう一度振り返ってみましょう。
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
この記述により生成されるURLは、
/tweets/id(数字)/comments
です。
例えば100個目の呟きにコメントしようとする場合、URLは
/tweets/100/comments
になるのです。
つまり、このコメントは100個目の呟きに対するコメントですよということが、URLから判断することができます。
ネストしていない場合は以下のように記述することになります。
Rails.application.routes.draw do
resources :tweets
resources :comments
end
この場合はそれぞれ
/tweets
/comments
のようなURLが生成され、100個目の呟きに紐付けされていないため、要件を満たすことができなくなってしまうのです。




関連付けって重要なんだね〜




いっぱい色々なものを関連付けさせたい場合はどうするんだろう?
いっぱいネストさせればいいのかな。
番外編 たくさんネストさせていいのか
結論、ネストさせすぎないようにしましょう。
URLの構造が複雑になりすぎ、保守性が低くなってしまうからです。
きちんと要件定義をし、コントローラーを分けていきましょう。




そうなんだね。
コントローラーの数が増えすぎちゃう気がして不安だよ〜




コントローラーはたくさんあってもいいんだよ!
1つのファイルにたくさん書きすぎないことが重要でね。
あとでそれぞれのコントローラーがどういう目的の処理を書いてあるかがちゃんとわかるようになっていれば十分なんだ。
まとめ
- ルーティングとは通信相手までの経路を判断する仕組み
- ルーティングのネストとは、段階に分けてルーティングを記述すること
- ルーティングをネストさせるとURLの階層構造が成り立ち関連付けできる



