deviseについて

# 最初に

**カレンダー企画2020の18日目**
プログラミングの勉強を始めて3ヵ月程経ったので学んだことのメモをアウトプットとして記事に残します。
これからプログラミングの世界に入る人の手助けになれたら嬉しい限りです。
間違っていたり、言葉が違っていたり、誤解されるような言葉があったら教えてください^^
言葉を長々と読みづらかったら申し訳ありません。少しずつなれてがんばります。


## gemについて

Rubyにはgemという便利なものがあります。
自分でいちから機能を作る事もできるのですが、複雑や大変だったりするのでそういった手間を省いて簡単に機能をアプリケーションに追加できるものです。開発スピードを上げることができます。
（注：頼りすぎは良くないです！って言われました^^）

そのgemの1つに「devise」というのがありそれを今回は取り上げでいきます。

## deviseとは？

deviseとは一体何をする機能があるのか？

よくネットのサービスを使用する際に、ユーザー登録を行いませんか？
新規登録とか、ログインとか

それができるgemです！

こういった機能も1から作成できるみたいですがこれを使えば簡単に機能として追加できます！


## 導入の仕方

### まずはインストールから

```ruby:Gemfile
.
.
.
.
.
.


gem "devise"
```

アプリケーションを作成した時にGemfileというのが作成されていると思います。
それを開いて一番下に上記のを追記してください。


```Terminal:ターミナル
$ bundle install
```

bundleもgemの一種ですがdeviseと違い機能を追加ではなく、gemを管理するものです。


```Terminal:ターミナル
$ rails g devise:install
```

deviseの初期設定をこれで行います。

導入の準備はこれで完了


### ログイン画面を表示させてみる

ユーザーテーブルを作成する。
テーブル作成も本来なら1から行いますがdeviseを使うと自動で生成してくれます。

```Terminal:ターミナル
$ rails g devise モデル名 #通常はrails g model モデル名ですがdeviseバージョンは左記
```

そうするとマイグレーションファイルが生成されています。
その中はこんな感じになっているかと、、、

```ruby
def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

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

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      # t.integer  :sign_in_count, default: 0, null: false
      # t.datetime :current_sign_in_at
      # t.datetime :last_sign_in_at
      # t.string   :current_sign_in_ip
      # t.string   :last_sign_in_ip

      ## Confirmable
      # t.string   :confirmation_token
      # t.datetime :confirmed_at
      # t.datetime :confirmation_sent_at
      # t.string   :unconfirmed_email # Only if using reconfirmable

      ## Lockable
      # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
      # t.string   :unlock_token # Only if unlock strategy is :email or :both
      # t.datetime :locked_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

```

これはdefaultです。
とくに問題なければこのままですし、
テーブル内にユーザーの名前や住所とか必要なカラム名はアプリケーションに合わせて追記をしてください。

追記が終わったら、

```Terminal:ターミナル
$ rails db:migrate
```

他にも
`config/routes.rb`や`app/model/モデル名.rb`にもdeviseの設定が記載されているはずです。

実はこれでもうログインページは使えます！^^


## 補足

### ログインページのレイアウトを変更したい時は

```Terminal:ターミナル
$ rails g devise:views #ファイル名を設定したい時はviewsの後に記述
```

### ログイン情報を追加した時

初期設定ではメールアドレスとパスワードのみになっている。
実際のアプリケーションでは名前などもログインの条件に入れたい！時に使います

```ruby:app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
    devise_parameter_sanitizer.permit(:sign_in, keys: [:name])
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :email])
  end
end

```

`before_action :configure_permitted_parameters, if: :devise_controller?`

devise機能を使う前`configure_permitted_parameters`の処理を行うよ！と定義
下記に定義された内容が実行される。

`devise_parameter_sanitizer.permit`データ操作を許可するメソッドです。
1行目：サインアップの際にnameのデータ操作が許可される。
2行目：サインインの際にnameのデータ操作が許可される。
3行目：アカウント情報更新の際にname,emailのデータ操作が許可される。

`protected`
これはストロングパラメーターと同様の機能です。少し違うのは、他のコントローラーから呼び出されても参照できるという点です。
`private`こっちは記述されたコントローラー内だけです。


## 最後に

deviseはとても便利なものです。うまく活用していけるといいですね。

deviseのコントローラーも追記した記憶あるので自分なりのカスタマイズはもっとできると思います。
ファイルの追加方法はviewsをcontrollersに変えただけだった気がします。（違ったらごめんなさい）