今回は、プログラミング初学者がつまずきやすい「ルーティングのネスト」について簡単に解説したいと思います。とある記述の中に入れ子構造で別の記述をする「ネスト」について、この記事を通して理解を深めていきましょう。
ルーティングのネストとは
ルーティングのネストとは、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述することです。
この表現だけでは何を意味しているのか分からないと思うので、ツイッターの例を用いて詳しく見ていきましょう。
ツイッターには、とある人がツイートを投稿した場合、そのツイートに対してコメントできる機能がありますよね(下の画像で言うと、トランプ大統領のツイートにMr.Aがコメントしています)。

その場合、このアプリケーションのルーティング(routes.rb)の記述は以下のようになります。
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
tweetsコントローラへのルーティングの記述の中に、commentsコントローラへの記述が書かれていますね。こうすることによって、どのツイートに紐づいたコメントなのかをURLで判別できるようにしています。
resourcesメソッドは、7つのアクション(index、show、new、create、edit、update、destroy)のルーティングを一括生成してくれるメソッドです。
ネストさせるメリット
ルーティングをネストさせることによって得られるメリットは主に2つあります。
- URLの階層構造ができる
- 関係性のあるもの同士を紐づけることができる(とあるツイートとそれに紐づくコメントなど)
それぞれ順番に見ていきましょう。
URLの階層構造ができる
ルーティングの記述をネストさせるとURLの階層構造ができます。先ほどのコードをもう一度振り返ってみましょう。
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
この記述により生成されるURLは、「/tweets/id/comments」になります。
もっと具体的に言うと、とあるツイートにコメントすると「/tweets/2/comments」のようなURLが生成されます。この「2」という数字はツイートのid番号です。
つまり、このコメントは2番のツイートに対するコメントですよということが、URLから判断することができます。
続いて、先ほどのコードを「rails routes」してみます。
すると、以下のようなパスが設定されていると思います。「/tweets/:tweet_id/comments(.:format)」に注目してください。「:tweet_id」の部分に、コメントと結びつくツイートのidが入ります。
Prefix Verb URI Pattern Controller#Action
tweet_comments POST /tweets/:tweet_id/comments(.:format) comments#create
それでは一方で、ネストさせていない場合はどうなるのでしょうか?
ルーティングの記述を以下のように編集しました。
Rails.application.routes.draw do
resources :tweets
resources :comments, only: [:create]
end
「rails routes」の結果がこのようになり、ツイートとコメントが結びついていないことが分かりますね。
Prefix Verb URI Pattern Controller#Action
comments POST /comments(.:format) comments#create
↓ 「rails routes」コマンドについて詳しく知りたい方はこちら

関係性のあるもの同士を紐づけることができる
ツイートとコメントの関係のように、ルーティングをネストさせることによって関係性のあるもの同士をを紐づけることができます。他にも、商品とそのレビューなどが例として挙げられます。
関係があるもの同士は、原則ルーティングをネストさせて関係性のあるURLを生成しましょう。
まとめ
- ルーティングのネストとは、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述すること
- 「rails routes」コマンドで生成されたパスを確認することができる
- ルーティングをネストさせるメリットは、「URL設計」と「関係性があるもの同士の紐付け」の2点である
今回は、ログラミング初学者がつまずきやすい「ルーティングのネスト」について簡単に解説しました。「ルーティングのネスト」はURL設計において非常に重要な概念なので、この機会にしっかり理解しておくことをおすすめします。