0
1

ルーティングは設定順も重要!!

Posted at

設定順を意識しないとどうなったか?

「id」を含むルーティングを指定した後、「id」を含まないルーティングに合わせてURLを入力しアクセスしたが、本来と違うアクションが動いてしまい、違うViewページを表示してしまった。

ルーティングの設定順ミスによる事例

今回はProgateのRailsコースを例に、ルーティングの設定順を意識せずに指定するとどうなるかの事例を挙げてみました。

routes.rb
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」にアクセスした後、こうなりました。
スクリーンショット 2023-11-20 22.01.08.jpg

なぜエラーが起きたかを追求すると、
①「users/show」のViewを表示したということは、「users/:id」のルーティングにアクセスしてしまった
スクリーンショット 2023-11-21 8.28.46.jpg

②URLに「id」を指定していないから、Userモデルのレコードを取得できず、「〇〇のメソッドが定義されていない」というエラーが起きた

そこで「id」を含むルーティングを、「user」を含むルーティングの後ろに設定しました。

routes.rb
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」にアクセス出来ました!!

スクリーンショット 2023-11-21 8.13.16.jpg

調べてみて分かったこと

最初はモデルからテーブルへの参照の仕方が間違っていると思い、Active Recordを見直したけど正しく指定されていました。
エラー解消に2時間も掛かってしまい、ルーティングの設定順を意識することの重要さを知りました(>_<)
「id」を含むルーティングと含まないルーティングが混同する状態で、URL指定時にルーティングがどう呼び出されるかを意識したいですね。

0
1
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
1