Rails

【Rails基礎】プログラミング初学者がつまずきやすい「ルーティングのネスト」について簡単に解説

Rails

 

今回は、プログラミング初学者がつまずきやすい「ルーティングのネスト」について簡単に解説したいと思います。とある記述の中に入れ子構造で別の記述をする「ネスト」について、この記事を通して理解を深めていきましょう。

サイトのURL設計をする上でとても重要な概念になります!

ルーティングのネストとは

ルーティングのネストとは、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述することです。

この表現だけでは何を意味しているのか分からないと思うので、ツイッターの例を用いて詳しく見ていきましょう。

ツイッターには、とある人がツイートを投稿した場合、そのツイートに対してコメントできる機能がありますよね(下の画像で言うと、トランプ大統領のツイートに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」コマンドについて詳しく知りたい方はこちら

Rails
【Rails基礎】ルーティングを確認できる「rails routesコマンド」の使い方を初心者向けに解説ルーティングが正しく設定されているか、どのようにコントローラーに処理を渡しているのかが確認できるコマンド「rake routes」について簡単に解説しています。resourcesメソッドを使用した時や、リンクを作成したい時に活躍するコマンドなので、ぜひこの機会に整理しておきましょう。...

 

関係性のあるもの同士を紐づけることができる

ツイートとコメントの関係のように、ルーティングをネストさせることによって関係性のあるもの同士をを紐づけることができます。他にも、商品とそのレビューなどが例として挙げられます。

関係があるもの同士は、原則ルーティングをネストさせて関係性のあるURLを生成しましょう。

モデルではこのような関係性を「has_many」と「belongs_to」で表現しているね。

まとめ

  • ルーティングのネストとは、あるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述すること
  • 「rails routes」コマンドで生成されたパスを確認することができる
  • ルーティングをネストさせるメリットは、「URL設計」と「関係性があるもの同士の紐付け」の2点である

 

 

今回は、ログラミング初学者がつまずきやすい「ルーティングのネスト」について簡単に解説しました。「ルーティングのネスト」はURL設計において非常に重要な概念なので、この機会にしっかり理解しておくことをおすすめします。