0
1

More than 3 years have passed since last update.

ユーザーマイページを作ったらdeviseのユーザー編集機能がおかしくなった

Posted at

概要

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

まとめ

ルーティングに限らず、プログラムの処理は上から実行されるのでそれを意識して実装を行った方が良い。
しっかりルーティングのことを理解していれば大丈夫かと思うのですが、なかなか調べても記事がなかったので書かせていただきました。

参考

【Rails】ルーティングは上から順に処理されるよという話

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