今更だけどdeviseのPrefixについて整理してみた

# はじめに
deviseで自動作成されるルーティングである「sessions」「password」「registrations」に関する備忘録です。
Prefixによる処理の記述はよく行いますが、「Prefixを見ただけでどんな処理が実行されるか？」をパッとイメージできなかったので整理しました。
ミスがあれば、コメントで教えてください。

# 開発環境
- Ruby 2.7.2
- Rails 6.1.3
- PostgreSQL 13.2

# 事前準備
まずはログイン機能をもつサンプルアプリを下記コマンドで作成します。
DBはPostgreSQL、テストファイルは不要なので-Tを付けます。

```ruby
rails new sample -d postgresql -T
```
`gem 'devise'`の記述をGemfileに追加し、`bundle install`をします。

次に、下記コマンドを実行し、ログイン機能に対応したUserモデルを作成します。

```ruby
rails g devise:install
rails g devise User
rails db:migrate
```

最後に、下記コマンドでDBの作成とマイグレーションを実行します。

```ruby
rails db:create
rails db:migrate
```

[http://localhost:3000/users/sign_in](http://localhost:3000/users/sign_in)にアクセスして、ログイン画面が表示されれば準備OKです。

# deviseで作成されたPrefixについて

## 現段階のuser関連のルーティング
`rails routes | grep user`を実行し、現段階のuser関連のルーティングを確認します。
コマンドを実行すると、下記が表示されます。
各行の一番最初の文字列がPrefixですね。

```
        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)    devise/registrations#cancel                                                                       
   new_user_registration GET    /users/sign_up(.:format)   devise/registrations#new                                                                     
  edit_user_registration GET    /users/edit(.:format)    devise/registrations#edit                                                               
       user_registration PATCH  /users(.:format)    devise/registrations#update                                                                              
                         PUT    /users(.:format)    devise/registrations#update                                                                          
                         DELETE /users(.:format)    devise/registrations#destroy                                                                          
                         POST   /users(.:format)    devise/registrations#create                                                                           
```

この結果を見てみると、作成されたPrefixは「user_session」「user_password」「user_registration」に関連していることがわかります。
大雑把ですが、それぞれこんな役割があります。

- user_session：ログイン・ログアウト関連
- user_password：パスワードの更新・再発行などパスワード関連
- user_registration：新規登録やユーザーデータの更新・削除など、登録情報関連

VERBがGETのものに限りますが、「http://localhost:3000/~~~ 」の~~~を上記のURLに変更して、どんな画面にアクセスするか確認してみてください。

## user_session
user_sessionに関するルーティングは、以下の通りです。

```
        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_session：ログインページへのアクセス
- user_session：ログイン処理
- destroy_user_session：ログアウト処理

## user_password
```
        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        
```
- new_user_password：パスワード再発行画面へのアクセス
- edit_user_password：パスワード編集画面へのアクセス
- user_password：パスワードの更新や削除などの処理

## user_registration

```
cancel_user_registration GET    /users/cancel(.:format)    devise/registrations#cancel                                                                       
   new_user_registration GET    /users/sign_up(.:format)   devise/registrations#new                                                                     
  edit_user_registration GET    /users/edit(.:format)    devise/registrations#edit                                                               
       user_registration PATCH  /users(.:format)    devise/registrations#update                                                                              
                         PUT    /users(.:format)    devise/registrations#update                                                                          
                         DELETE /users(.:format)    devise/registrations#destroy                                                                          
                         POST   /users(.:format)    devise/registrations#create 
```
- new_user_registration：アカウント登録ページへのアクセス
- edit_user_registration：アカウント編集ページへのアクセス
- user_registration：アカウント編集、更新、削除の処理

# 最後に
今回はdeviseで自動作成されるルーティングのPrefixについてまとめました。
Prefixから処理の内容をイメージするために整理しましたが、もう少し勉強が必要な箇所がある（特に、passwordらへん）ので、引き続き勉強を続けていきます。

参考記事：[【Rails】devise関連のルーティングまとめ](https://qiita.com/beanbeenzou/items/1ff9c7cba61fd1fa5c80)