新規投稿ページの作成のため、ルーティングの設定で私は最初
get "posts/:id" => "posts#show" #showは投稿内容の詳細ページへのアクション
get "posts/new" => "posts#new" #newは新規投稿ページへのアクション
と設定していた。
しかしリンクから新規投稿ページにアクセスしたところ下図のようなエラーが生じた。
エラー内容を見ていると、どうやらPostコントローラーのshowアクションに関してエラーが生じているように見える。(NoMethodError in Posts#showより)
しかしアクセスしたリンクは新規投稿ページへのリンクだったはずである。どうしてこのようなエラーが生じてしまったのだろうか。
その理由はルーティングの順番にある。
:idという変数は何に対してもマッチしてしまう。例えば以下のようなルーティングを設定しているとしよう。
get "posts/index" => "posts#index"
get "posts/:id" => "posts#show"
get "posts/new" => "posts#new"
新規投稿ページへアクセスしようとする際、ルーティングに対して上から順番にnewのファイルに関するルーティングを探す。変数:idは先ほど述べたように何に対してもマッチしてしまうため
get "posts/:id" 部分は get "posts/new"としてしまう。
ゆえにget "posts/new" => "posts#show"として処理されてしまうためアクセス時にエラーが生じてしまった。
ではエラーが起こらないようにするにはどうすれば良いか。
何に対しても:idはマッチしてしまうので、解決策としては:idと書かれているルーティングは最後に書けば良い。