初めに
- 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のルーティングを行うときは一番下に書く