deviseについて

#WHY
deviseの導入やデフォルトの設定など度々わすれてしまうので１つのアウトプットとしてこれに書き出す。

-----
#deviseとは
ユーザーの管理機能やログイン機能などが簡単に実装できるGem。

##deviseの導入
<b>Gemfile</b>の最後に記述

```ruby
gem 'devise'
```
<b>ターミナル</b>で以下を記述していく
※pwcはカレントディレクトリが導入したいディレクトリであることを確認するため

```
pwd

bundle install

rails g devise:install
```
最後に<b>「* Not required *」</b>と表記されれば成功。

##モデルを作成
<b>ターミナル</b>で以下を実行

```
rails g devise user
```
db/migrateディレクトリに<b>20XXXXXXXXX_devise_create_users.rb</b>のようなマイグレーションファイルが生成される。
続いてルーティングに

```ruby

Rails.application.routes.draw do
  devise_for :users
end
```
のような記述がある。<br>これでユーザー機能に必要なルーティングを一度に生成してくれている。

##テーブルを作成
マイグレーションファイルをみてみるとすでに<b>email</b>と<b>password</b>は記述されている。

```ruby
create_table :users do |t|
     ## Database authenticatable
     t.string :email,              null: false, default: ""
     t.string :encrypted_password, null: false, default: ""
 #以下略
```
これに続けて追加したいカラムを記述していき、マイグレートする。

```
rails db:migrate
```
ビューファイルも自動生成されるがデフォルトでは編集することができないため、<br>ターミナルで以下のようなコードを実行し、<br>deviseに用意された<b>ビューファイルをコピー</b>し、app/viewsの配下に配置する

```
rails g devise:views
```

##その他deviseのデフォルト設定など
###encrypted_password
deviseではデフォルトで普通のpasswordではなく、<b>encrypted_password</b>が用意されている。<br>deviseを使用する場合、新規登録の際に<b>passwordというキー</b>に対して入力された値は<b>暗号化</b>されてencrypted_passwordというカラムに保存される。
そのため、パスワード入力フィールドには<b>:password</b>や<b>:password_confirmation</b>を使用するが、<br>deviseを使用する場合はテーブルに<b>passwordカラムやpassword_confirmationカラムがなくても問題ない</b>。

```ruby
<%= f.label :password, "パスワード（6文字以上）" %><br />
 <%= f.password_field :password, autocomplete: "new-password" %>

 <%= f.label :password_confirmation, "パスワード再入力" %><br />
 <%= f.password_field :password_confirmation, autocomplete: "new-password" %>

#[:password][:password_confirmation]で情報は受け取るが、
#encrypted_passwordカラムで保存される
```

###devise_parameter_sanitizerメソッド
deviseを導入することによって使えるメソッド。
デフォルトのままだとemail , passwordはパラメーターから取得できるが、カラムを追加した場合はその<b>追加したカラムの情報</b>が受け取れない。
devise_parameter_sanitizerメソッドで<b>受け取りたいパラメーターを指定</b>することができる。
※emailとpasswordは指定しなくていい。

```ruby
private
def configure_permitted_parameters  # メソッド名は慣習
  # deviseのUserモデルにパラメーターを許可
  devise_parameter_sanitizer.permit(:deviseの処理名, keys: [:許可するキー])
end
```
deviseの処理名

|処理名|役割|
|:--:|:--:|
|:sign_in|サインイン（ログイン）の処理を行うとき|
|:sign_up|サインアップ（新規登録）の処理を行うとき|
|:account_update|アカウント情報更新の処理を行うとき|

また、定義したconfigure_permitted_parametersメソッドは<b>deviseに関するコントローラーの処理</b>のときだけ使用したいので<b>before_action</b>を使い、このように記述する。

```ruby
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
```
###デフォルトのバリデーション
deviseにはもとからバリデーションが設けられているものがある。
（例）
・メールアドレスには@が含まれていないと保存できない
・メールアドレスが重複していると保存できない
・パスワードは「6〜128文字」
文字数などのバリデーションはconfig/initializers/devise.rbで確認、変更できる。
<br>
また、自分でバリデーションを設定したいとき、デフォルトのバリデーションが邪魔をする時は、

```ruby
class User < ApplicationRecord
 devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :validatable　
                                  #↑削除する。
end
```
モデルファイルの上記の記述を削除すればバリデーションが無効になる。

--------
configure_permitted_parametersとかdevise_parameter_sanitizerは長すぎて今だに覚えれてないので、自分の記事からコピペします、、、