【Rails】Deviseをカスタマイズして使いたい！！(ルーティング編)

# どうした？

前回の記事では、Deviseを導入しUserモデルを作成しました。

https://qiita.com/ysk91_engineer/items/108e8d451aa33333e248

今回の記事では、

* ルーティングを設定し、URLとパスをカスタマイズ
* コントローラファイルを作成し、アクションを設定
* ビューファイルを用意し、ページにアクセスする

を目標に進めていきます。



# 今回目指すもの

前回作成したUserモデルに対して、以下の処理をするためのルーティングを作成していきます。

**registrations_controller**

| HTTPリクエスト | パス                    | URL           | アクション | 処理内容 |
|:-:         |:-:                      |:-:            |:-:     |:-:|
| get        | new_user                | sign_up        | new    | ユーザーの新規作成フォーム |
| post       |users                    | users          | create | ユーザーの新規作成ができる |
| get        | edit_user               | users/:id/edit | edit   | ユーザー情報の編集フォーム |
| patch      | user                    | users/:id      | update | ユーザー情報の編集ができる |

**sessions_controller**

| HTTPリクエスト | パス                 | URL            | アクション | 処理内容 |
|:-:         |:-:                   |:-:             |:-:     |:-:|
| get        | login                | login          | new    | ユーザーのログインフォーム |
| post       |                      | login          | create | ユーザーがログインできる |
| destroy    | logout               | logout         | delete | ユーザーがログアウトできる |


# 手順

## ルーティングの設定
まずは usersに対してルーティングを設定していきます。

```ruby:routes.rb
devise_for :users
```
このままではコントローラがないため、ルーティングは機能しません。
コントローラファイルを作っていきましょう。


## コントローラファイルの作成

まずはページアクセスのためにコントローラファイルを準備します。

```terminal
$ rails generate devise:controllers users
```

これにより、`app/controllers`フォルダ内にusersフォルダといくつかのコントローラファイルが生成されます。
生成されたusersフォルダの中身は以下のようです。

* users
    * confirmations_controller.rb
    * omniauth_callbacks_controller.rb
    * passwords_controller.rb
    * resistrations_controller.rb
    * sessions_controller.rb
    * unlocks_controller.rb

このうち必要なものは`resistrations_controller.rb`と`sessions_controller.rb`なので、それ以外は削除してしまいましょう。

## resistrations_controller.rb

このコントローラでは、ユーザー作成と編集が行えるようにします。

## ルーティングの設定

ルーティングファイルにて「Users::RegistrationsControllerを使うよ」という宣言をします。

```ruby
# 認証
devise_for :users, controllers: {
  registrations:  'users/registrations'
}
```

これにより、Deviseは自動で以下のルーティングを生成します。

```terminal
$ rails routes | grep users

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
```

## 各アクションの設定

resistrationsコントローラのnewアクションを設定しましょう。

コントローラファイルを見ると、各アクションがコメントアウトされています。
newアクションを使用するので、コメントアウトを取り消しましょう。

```ruby
# GET /resource/sign_up
def new
  super
end
```

newアクションの中身を見ると、`super`とだけ書かれています。
superということは、親クラスである`Devise::RegistrationsController`を[継承している](https://github.com/heartcombo/devise/blob/main/app/controllers/devise/registrations_controller.rb)ようです。
今の所は無視して進めます。

## ビューファイルの作成

ビューファイルを用意して`users/new`ページを表示させましょう。
ルーティングを確認すると

```
new_user_registration       GET       /users/sign_up(.:format)      users/registrations#new
```

とあるので、ビューファイルは`app/views/users/resistrations`フォルダ内に作れば良いことが分かります。

試しに空の`new.html.erb`ファイルを作成してみます。
/users/sign_upにアクセスしてみると、無事にページを開けていることが分かります。

## sessions_controller

このコントローラでは、ユーザーがログインとログアウトを行えるようにします。

resistrations_controllerと同様の手順で作業します。

まずは、ルーティングを追加しましょう。
```ruby
devise_for :users, controllers: {
  registrations:  'users/registrations', # カンマで区切るのを忘れない！
  sessions:       'users/sessions'
}
```

ルーティングを確認すると、
```
new_user_session            GET       /users/sign_in(.:format)      users/sessions#new
user_session                POST      /users/sign_in(.:format)      users/sessions#create
destroy_user_session        DELETE    /users/sign_out(.:format)     users/sessions#destroy
```

が追加されているので、new.html.erbは`app/views/users/sessions`フォルダ内に作れば良いことが分かります。

ビューファイルを作成したら、sessionsコントローラにて`new`アクションのコメントアウトを取り消しましょう。

/users/sign_inにアクセスすることができるかと思います。

## URLとパスをカスタマイズしよう

現在のURLやパスはDeviseが自動で作成したものです。
これを、設計に沿って変更しましょう。

ルーティングファイルを以下のように修正します。

```ruby
devise_for :users, controllers: {
  registrations:  'users/registrations',
  sessions:       'users/sessions'
}, skip: [:registrations, :sessions]
devise_scope :user do
  get       'sign_up', to:            'users/registrations#new',      as: :new_user
  post      'users', to:              'users/registrations#create'    as: :users
  get       'users/:id/edit', to:     'users/registrations#edit',     as: :edit_user
  patch     'users/:id', to:          'users/registrations#update'    as: :user

  get       'login', to:              'users/sessions#new',           as: :login
  post      'login', to:              'users/sessions#create'
  delete    'logout', to:             'users/sessions#destroy',       as: :logout
end
```

* `devise_for`ブロックでは、コントローラの呼び出し
* `skip:`では、`devise_for`が自動で作成したルーティングを削除(カスタマイズしたい為)
* `devise_scope`では、URLとアクションの指定
* `as:`では、パスの指定
をしています。


ルーティングを確認すると

```ruby
$ routes | grep users

new_user        GET    /sign_up(.:format)          users/registrations#new
users           POST   /users(.:format)            users/registrations#create
edit_user       GET    /users/:id/edit(.:format)   users/registrations#edit
user            PATCH  /users/:id(.:format)        users/registrations#update
login           GET    /login(.:format)            users/sessions#new
                POST   /login(.:format)            users/sessions#create
logout          DELETE /logout(.:format)           users/sessions#destroy
```
が得られます。

/sign_upにアクセスすると、無事にページが表示されています。

# まとめ

今回はルーティングを設定しました。
次回はコントローラとビューファイルを整えて、

* ユーザー作成
* ログイン

ができるようにします。

https://qiita.com/ysk91_engineer/items/e19ae367dd5094217c03

最後までお読みいただきありがとうございました。