[Rails] deviseの導入方法

# はじめに
Ruby on RailsのGemであるdeviseの導入方法について紹介します。
私自身プログラミングを初めて半年程の初心者の為、不備等あるかも知れませんが、最後までご覧頂けたら嬉しいです。

それでは早速始めていきましょう！

# deviseとは
RubyのGem(ライブラリ)の1つ。
User管理機能を簡単に実装するためのGem。
実際に運用されている多くのRailsアプリケーションで使用されている。

# deviseインストール
Gemfileに追記

```ruby:Gemfile
# 最後の行
gem 'devise'
```
Gemfile記述後、ターミナルでGemのインストールをおこなう。
※カレントディレクトリが作業ディレクトリになっていること

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

**設定フォイルも一緒に作成**
deviseを使用するためには、Gemのインストールに加え、 devise専用のコマンドで設定ファイルを作成する必要がある。
※現時点では、Gem(devise)をインストールしたら、最初に1度実行しておく程度の認識で問題ありません。

```:ターミナル
% rails g devise:install
```

# Userモデルを作成
**deviseのモデル作成用コマンドでUserモデルを作成**
rails g deviseコマンドは、deviseによるユーザー機能の対象を指定することで、モデルとマイグレーションの生成やルーティングの設定などをまとめておこなってくれる。

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

実行すると、モデルが生成され、routes.rbにはdeviseに関連するパスが追加される。

 **テーブルを作成**

```ruby:db/migrate/20XXXXXXXXX_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 :nickname,           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
```
マイグレーションファイルを見てみると、
emailとパスワード用のカラムは自動で生成されるようになっているので、
他に追加したいものがあればここでマイグレーションファイルに追記する。
（今回はnicknameカラムを追加する）

**マイグレーションを実行**

```:ターミナル
% rails db:migrate
```

ここまででusersテーブルが作成できました。

# deviseのビュー作成
現時点でdeviseのログイン/サインアップ画面が自動的に生成されるがビューファイルとしては生成されない。
これは、deviseのGem内に存在するビューファイルを読み込んでいるため。
deviseのビューファイルに変更を加えるためには、deviseのコマンドを利用して、ビューファイルを生成する必要がある。

```:ターミナル
% rails g devise:views
```

これで、deviseに用意されたビューファイルをコピーし、app/viewsの配下に作成できる。
ビューをカスタマイズしたい場合は、ここで生成されたファイルを編集すれば良い。

今回はニックネームカラムを追加した為、サインアップ画面にニックネーム入力欄を追加する。

```ruby:app/views/devise/registrations/new.html.erb
<h2>Sign up</h2>

<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
  
　# 省略

  <div class="field">
    <%= f.label :nickname %><br />
    <%= f.text_field :nickname, autofocus: true %>
  </div>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email %>
  </div>

  # 省略

<% end %>

<%= render "devise/shared/links" %>

```

# コントローラの編集
サインアップ時にUser情報を受け取れるようにする。
deviseの処理を行うコントローラーはGem内に記述されているため、編集することができない。

application_controller.rbに記載する。
このフォイルに記述することで、全てのコントローラーに継承される。

```ruby:app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  private
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname])
  end
end
```
### 上記のコード説明
**if: :devise_controller?**
deviseに関するコントローラーの処理であれば、そのときだけconfigure_permitted_parametersメソッドを実行するように設定している。
:devise_controller?とは、deviseのヘルパーメソッド。

**configure_permitted_parameters**
deviseの提供元では、新たに定義するメソッド名をconfigure_permitted_parametersと紹介していることから、慣習的にこのメソッド名で定義することが多い。
あくまで慣習なので定義するメソッド名は自由。

**devise_parameter_sanitizer**
deviseにおけるparamsのようなメソッド。deviseのUserモデルに関わる「ログイン」「新規登録」などのリクエストからパラメーターを取得できる。

**permit(:sign_up, keys: [:nickname])**
deviseに定義されているpermitメソッドであり、Railsではじめから使用できたpermitメソッドとは異なるもの。
第一引数にdeviseの処理名、第二引数にkeysというキーに対し、配列でキーを指定することで、許可するパラメーターを追加する。


**devise_parameter_sanitizerメソッドとpermitメソッドを組み合わせることにより、deviseに定義されているストロングパラメーターに対し、自分で新しく追加した（今回ならnickname）カラムも指定して含めることができる。**


# おまけ
deviseでよく使うメソッドを紹介します。
**user_signed_in?** 
Userがログイン済みかtrueかfalseを得ることができる。

# 最後に
今回は私がRuby on Railsを始めて一番最初に難しいと思った実装について紹介しました。

どうしても分からなかったり、間違い箇所がありましたら、質問を頂ければと思います。
Twitterアカウント：　https://twitter.com/DeguchiRyo0527

最後までご覧頂きありがとうございます。