ルーティングの順番に氣を付ける

初めに

  • Progateを学習中に躓いたところをアウトプットして学習効率を上げると同時に備忘録としても記事を書いていこうと思います。

結論

  • idを含むURLのルーティングは後に回す

ルーティングの順番によって表示されるものが変わってくる。

routes.rb
Rails.application.routes.draw do
  get "posts/index" => "posts#index"
  get "posts/:id" => "posts#show"
  get "posts/new" => "posts#new"
  

  get "/" => "home#top"
  get "about" => "home#about"
end
  • get "posts/:id" => "posts#show"が get "posts/new" => "posts#new"よりも上に来ている

  • /posts/newをURLに書き、表示させてみる

view

  • 投稿ページのはずなのですが、投稿できない画面になっている

  • get "posts/:id" => "posts#show"を下にしてget "posts/new" => "posts#new"を上にしてルーティングを書き換えてみる

routes.rb
Rails.application.routes.draw do
  get "posts/index" => "posts#index"
  get "posts/new" => "posts#new"
  get "posts/:id" => "posts#show"
  

  get "/" => "home#top"
  get "about" => "home#about"
end
view

  • 今度はきちんと投稿ページが表示された。

原因

  • ルーティングは基本的には上から優先される

  • get "posts/:id" => "posts#show"を get "posts/new" => "posts#new"より先に書いてしまうとposts/newというURLがposts/:idというルーティングに  合致してしまうから

  • :idは変数だからすべきURLに辿り着く前にあらゆるURLを含むルーティングと合致してしまう

結語

  • ルーティングは上から順にコードを読む

  • 変数を含むURLのルーティングを行うときは一番下に書く

参考にしたサイト

qiita.com

qiita.com