【Rails・備忘録】deviseについて

## はじめに
こんにちは、だいごです。
今回は、Railsにおいてユーザー管理機能を簡単に実装することができるdeviseについてまとめていきます。
よかったらご覧ください。

## deviseとは
![ダウンロード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600899/ca14f8c0-fd99-61b1-a4cc-58424d886b96.png)

ユーザー管理機能を簡単に実装するためのGem（※1）。
ログイン、サインアップなどのログイン機能を1から構築するのはかなり大変ですが、Deviseを利用することで簡単に実装することが出来ます。

deviseで実装できる主な機能としては、
- サインアップ機能
- サインイン機能
- アカウント編集機能
- パスワード変更機能
- メール認証機能
- アカウント凍結機能

(※１)RubyGemsにはたくさんのライブラリがあり、それぞれをGemと呼ぶ。

## deviseの使い方
ここからはdeviseのインストールからデバイス関連のコマンドについてまとめていきます。

### deviseのインストール
まずはdeviseのインストールの手順からまとめていきます。
初めはGemfileの編集です。

```ruby:Gemfile
# 中略
gem 'devise'
```

次にコマンドを実行し、インストールします。

```zsh:ターミナル
% bundle install
```

あとはサーバーを再起動すればインストールは完了です。

### deviseの設定ファイルの作成
ここではdevise関連のファイルの作成手順をまとめていきます。
ここで使用するコマンドは、

<b>rails g devise:install</b>

で、これはdeviseの「設定関連に使用するファイル」を自動生成してくれるコマンドになります。

ターミナルでコマンドを実行していきます。

```zsh:ターミナル
% rails g divise:install
```

コマンド入力後、以下のような表示が出ればOKです。

```zsh:ターミナル
　　　　　　　　　　　　create  config/initializers/devise.rb
      create  config/locales/devise.en.yml
===============================================================================

Depending on your application's configuration some manual setup may be required:

  1. Ensure you have defined default url options in your environments files. Here
     is an example of default_url_options appropriate for a development environment
     in config/environments/development.rb:

       config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }

     In production, :host should be set to the actual host of your application.

     * Required for all applications. *

# 中略

  4. You can copy Devise views (for customization) to your app by running:

       rails g devise:views

     * Not required *

===============================================================================
```

### deviseによるモデルの作成
続いて、deviseでモデルの作成をしていきます。
ここで使用するコマンドは、

<b>rails g devise</b>

で、これはモデルとマイグレーションの生成やルーティングの設定などをまとめて処理するコマンドです。
実行することで、モデルが生成され、routes.rbにはdeviseに関連するパスが追加されます。

ターミナルでコマンドを実行していきます。

```zsh:ターミナル
% rails g devise user
```

ここで、モデル名は単数系としておきます。
コマンド入力後、以下のようになれば成功です。

```zsh:ターミナル
　　　　　　　　　　　　invoke  active_record
      create  db/migrate/20200309082300_devise_create_users.rb
      create  app/models/user.rb
      invoke  test_unit
      create  test/models/user_test.rb
      create  test/fixtures/users.yml
      insert  app/models/user.rb
       route  devise_for :users
```

ここで、コマンドにより作成されたマイグレーションファイルとルーティングを見ていきます。

まずは、マイグレーションファイルです。

```ruby:20220408065516_devise_create_users.rb
class DeviseCreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## カラムの追加が可能
      t.string :name,               null: false

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

## 中略

      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    # add_index :users, :confirmation_token,   unique: true
    # add_index :users, :unlock_token,         unique: true
  end
end
```

こんな感じになってます。
ターミナルで<b>rails db:migrate:status</b>を実行し、statusを確認します。statusが<b>down</b>の状態でファイルを編集して、ターミナルで<b>rails db:migrate</b>を実行してあげればモデルにカラムを追加することができます。

次に、ルーティングです。

```ruby:config/routes.rb
Rails.application.routes.draw do
  # devise_forメソッド
  devise_for :users  

  root to: 'prototypes#index'  
  resources :prototypes
end
```
先ほど実行したコマンドにより、

<b>devise_for</b>

が生成されています。
これは、ユーザー機能に必要な複数のルーティングを一度に生成してくれるdeviseメソッドにです。
個人的に大事だと思ったので触れてみました。

### deviseによるビューの作成
最後に、ビューの作成を作成していきます。
ここで使用するコマンドは、

<b>rails g devise:view</b>

です。
これは、deviseに用意されたビューファイルをコピーし、app/viewsの配下に配置してくれるコマンドで、HTMLを修正できるため、カスタマイズも可能です。

コマンドを実行していきます。

```zsh:ターミナル
% rials g devise:views
```

コマンド入力が成功すれば、以下のディレクトリが生成されます。
- sessions：ログイン画面
- registrations：ユーザ登録画面とアカウント編集画面
- confirmations：認証メール再送信するための画面
- passwords：パスワードを変更するための画面
- unlocks：アカウント凍結画面
- shared：Deviseの画面に遷移させるためのリンク

基礎の基礎は抑えられたと思うので今回はこの辺にしておきます。

## おわりに
最後まで読んでいただきありがとうございます。
まとめるのが下手で無駄に長くなってしまいました、、
今後も自身の学びを発信していこうと思うのでよかったらご覧ください。
ご指摘・コメントお待ちしております。
ありがとうございました。