設定順を意識しないとどうなったか?
「id」を含むルーティングを指定した後、「id」を含まないルーティングに合わせてURLを入力しアクセスしたが、本来と違うアクションが動いてしまい、違うViewページを表示してしまった。
ルーティングの設定順ミスによる事例
今回はProgateのRailsコースを例に、ルーティングの設定順を意識せずに指定するとどうなるかの事例を挙げてみました。
Rails.application.routes.draw do
get "signup" => "users#new"
get "login" => "users#login_form"
post "login" => "users#login"
post "logout" => "users#logout"
get "users/:id" => "users#show" ## idを含むルーティング
get "users/:id/edit" => "users#edit" ## idを含むルーティング
post "users/:id/update" => "users#update" ## idを含むルーティング
get "users/index" => "users#index"
post "users/create" => "users#create"
get "posts/index" => "posts#index"
get "posts/new" => "posts#new"
post "posts/create" => "posts#create"
get "posts/:id" => "posts#show"
get "posts/:id/edit" => "posts#edit"
post "posts/:id/update" => "posts#update"
post "posts/:id/destroy" => "posts#destroy"
get "/" => "home#top"
get "about" => "home#about"
end
上記のルーティングで「users/index」にアクセスした後、こうなりました。
なぜエラーが起きたかを追求すると、
①「users/show」のViewを表示したということは、「users/:id」のルーティングにアクセスしてしまった
②URLに「id」を指定していないから、Userモデルのレコードを取得できず、「〇〇のメソッドが定義されていない」というエラーが起きた
そこで「id」を含むルーティングを、「user」を含むルーティングの後ろに設定しました。
Rails.application.routes.draw do
get "signup" => "users#new"
get "login" => "users#login_form"
post "login" => "users#login"
post "logout" => "users#logout"
get "users/index" => "users#index"
post "users/create" => "users#create"
get "users/:id" => "users#show"
get "users/:id/edit" => "users#edit"
post "users/:id/update" => "users#update"
get "posts/index" => "posts#index"
get "posts/new" => "posts#new"
post "posts/create" => "posts#create"
get "posts/:id" => "posts#show"
get "posts/:id/edit" => "posts#edit"
post "posts/:id/update" => "posts#update"
post "posts/:id/destroy" => "posts#destroy"
get "/" => "home#top"
get "about" => "home#about"
end
すると「users/index」にアクセス出来ました!!
調べてみて分かったこと
最初はモデルからテーブルへの参照の仕方が間違っていると思い、Active Recordを見直したけど正しく指定されていました。
エラー解消に2時間も掛かってしまい、ルーティングの設定順を意識することの重要さを知りました(>_<)
「id」を含むルーティングと含まないルーティングが混同する状態で、URL指定時にルーティングがどう呼び出されるかを意識したいですね。