Rails初学者がつまずきやすいルーティングのネストを徹底解説

スポンサーリンク

はじめに

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

思う通りにルーティングが実行が書けない。ルーティングの仕組みがそもそもよくわかっていない。という人はこの記事を読んで理解を深めていきましょう。

クマくん
クマくん

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

さめさん
さめさん

みんなが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の階層構造が成り立ち関連付けできる
ネストしすぎに注意だよ!
Rails
スポンサーリンク
クマくんをフォローする
目指せ、スーパーエンジニア
タイトルとURLをコピーしました