0
0

More than 3 years have passed since last update.

ルーティングを書く順番

Last updated at Posted at 2021-06-23

新規投稿ページの作成のため、ルーティングの設定で私は最初

get "posts/:id" => "posts#show" #showは投稿内容の詳細ページへのアクション
get "posts/new" => "posts#new" #newは新規投稿ページへのアクション

と設定していた。
しかしリンクから新規投稿ページにアクセスしたところ下図のようなエラーが生じた。

スクリーンショット 2021-06-23 15.16.17.png

エラー内容を見ていると、どうやら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と書かれているルーティングは最後に書けば良い。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0