概要
deviseを使ってユーザー管理機能を実装していたアプリで、マイページを作ったら編集ページが表示されなくなった。
環境
Rails 6.0.0
Ruby 2.6.5
原因
ルーティングの表示の順番が原因で、ユーザー編集ページが意図通り表示されていなかった。
マイページのURIはusers/(user.id)
で、編集ページはusers/edit
の設定。
paramsを確認したところ "id"=>"edit"
と記載があり、
なぜかeditをuser.idと勘違いしてマイページを表示しようとしていたのが原因の様子。
エラー文
ActiveRecord::RecordNotFound in UsersController#show
Couldn't find User with 'id'=edit
ルーティングはこんな感じ
routes.rb
Rails.application.routes.draw do
resources :users, only: :show
devise_for :users, controllers: {
registrations: 'users/registrations'
}
end
関係する部分だけ
user GET /users/:id(.:format) users#show
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
user_password PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
POST /users/password(.:format) devise/passwords#create
cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel
new_user_registration GET /users/sign_up(.:format) users/registrations#new
edit_user_registration GET /users/edit(.:format) users/registrations#edit
user_registration PATCH /users(.:format) users/registrations#update
PUT /users(.:format) users/registrations#update
DELETE /users(.:format) users/registrations#destroy
POST /users(.:format) users/registrations#create
解決策
ルーティングの記述する順番を変更した。
編集ページが優先されるようにdevise_for :users, controllers: {registrations: 'users/registrations'}
の下にresources :users, only: :show
を記載すればよかっただけ。
routes.rb
Rails.application.routes.draw do
devise_for :users, controllers: {
registrations: 'users/registrations'
}
resources :users, only: :show # devise_forの下に記述するように変更
end
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
user_password PATCH /users/password(.:format) devise/passwords#update
PUT /users/password(.:format) devise/passwords#update
POST /users/password(.:format) devise/passwords#create
cancel_user_registration GET /users/cancel(.:format) users/registrations#cancel
new_user_registration GET /users/sign_up(.:format) users/registrations#new
# 編集ページが優先される
edit_user_registration GET /users/edit(.:format) users/registrations#edit
user_registration PATCH /users(.:format) users/registrations#update
PUT /users(.:format) users/registrations#update
DELETE /users(.:format) users/registrations#destroy
POST /users(.:format) users/registrations#create
# マイページはここに記載
user GET /users/:id(.:format) users#show
まとめ
ルーティングに限らず、プログラムの処理は上から実行されるのでそれを意識して実装を行った方が良い。
しっかりルーティングのことを理解していれば大丈夫かと思うのですが、なかなか調べても記事がなかったので書かせていただきました。