deviseをRailsで扱う

まず、こちらではデバイス導入の一連の流れ（自分が行った）ことを復習として、また忘れないようこちらに記載させていただこうかと思います。
初学者なので間違ったことを伝えていた場合は、都度ご連絡お願い申し上げます。

##deviseについて
まず、デバイスの概要ですが、こちらはユーザー管理機能を実装するためのGemです。
新規登録やログインログアウトなんかが簡単に実装できます。

##deviseの導入
Gemfileを編集しましょう

```
gem 'devise'（一番最後の行に追記しましょう）
```

これで、ローカル、テスト、本番環境でデバイスが扱えます。

##ローカルサーバーを再起動
Gemをインストールした後はターミナルで起動しているローカルサーバーを一度再起動しましょう。
インストールしたGemの反映のタイミングが、サーバー起動時のためです。

##deviseの設定ファイルを作成
deviseを使用するためには、Gemのインストールに加え、devise専用のコマンドで設定ファイルを作成する必要があります。
こちらのコマンドでファイルを作りましょう

```
% rails g devise:install
```
以下のようなログが流れると成功！

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

  2. Ensure you have defined root_url to *something* in your config/routes.rb.
     For example:

       root to: "home#index"
     
     * Not required for API-only Applications *

  3. Ensure you have flash messages in app/views/layouts/application.html.erb.
     For example:

       <p class="notice"><%= notice %></p>
       <p class="alert"><%= alert %></p>

     * Not required for API-only Applications *

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

       rails g devise:views
       
     * Not required *

===============================================================================

```

###デバイスでUserモデルを作成
deviseを利用する際には、アカウントを作成するためのUserモデルを新しく作成する必要があります。
作成には通常のモデルの作成方法ではなく、deviseのモデル作成用コマンドでUserモデルを作成します。
下記のコマンドでモデルとそれに付随するマイグレーションファイル、ルーティングの設定をまとめて生成でき
routes.rbにはdeviseに関連するパスが追加されます。

```
 rails g devise user
```
以下のログにて成功

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

また、routes.rbに以下のルーティングが自動的に追記されます。

```
Rails.application.routes.draw do
  devise_for :users
  root to: 'tweets#index'
  resources :tweets
end
```
devise_forは、ユーザー機能に必要な複数のルーティングを一度に生成してくれるdeviseのメソッド。

###テーブルの作成
先ほどのコマンドでマイグレーションファイルも生成されたのでマイグレーションを行います。

```
rails db:migrate
```
こちらでテーブルの作成が完了しました。

**テーブルの情報を変更（マイグレーション）したので、ローカルサーバーを起動時には、再起動しましょう。**

###deviceのビューファイルの作成
deviseでログイン機能を実装すると、ログイン/サインアップ画面が自動的に生成されますがビューファイルとしては生成されません。
これは、deviseのGem内に存在するビューファイルを読み込んでいるためです。

deviseのビューファイルに変更を加えるためには、deviseのコマンドを利用して、ビューファイルを生成する必要があります。

 コマンドを実行してdevise用のビューを作成

```
% rails g devise:views
```

こちらで作成されたログイン画面のビュー、新規登録画面のビューファイルを編集して見た目を作っていきます。

こちらでdeviceの基礎的な導入は完了です。
簡単なものであればこちらで大丈夫かなと言う認識ですが、
他にdeviseで用いられる

```
rails g devise:contoroller users
```
があったりします。
そちらの使い方は、以下別の記事でまとめたいと思います。
（必要になる基準を理解していないため）


###ストロングパラメーターの設置
サインアップ時に入力する情報はパラメーターとしてサーバーに送信されます。deviseを使わない通常のリクエストの場合は、コントローラーにストロングパラメーターを記述し、受け取れるパラメーターを制限していました。

deviseに関しても、同様にストロングパラメーターをコントローラーに記述します。しかし、deviseの処理を行うコントローラーはGem内に記述されているため、編集することができません。
また、deviseでログイン機能を実装した場合は、paramsの他に、paramsとは異なる形のパラメーターも受け取っています。

以上から、deviseのコントローラーにストロングパラメーターを反映する方法と、devise特有のパラメーターを取得する方法が、必要になります。

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

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

devise_parameter_sanitizerメソッドは、これまでのストロングパラメーターと同じく、新たに定義するプライベートメソッドの中で使用します。deviseの提供元では、新たに定義するメソッド名をconfigure_permitted_parametersと紹介していることから、慣習的にこのメソッド名で定義することが多いです。

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

deviseのpermitは、第一引数にdeviseの処理名、第二引数にkeysというキーに対し、配列でキーを指定することで、許可するパラメーターを追加します。

第一引数の処理名には、deviseですでに設定されているsign_in, sign_up, account_updateが使用でき、それぞれサインイン時やサインアップ時、アカウント情報更新時の処理に対応しています。

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

これらの記述を**application_controller.rb**に記述します。

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
```
before_actionのifというオプションを使用している点に注目してください。
これは、値にメソッド名を指定することで、その戻り値がtrueであったときにのみ処理を実行するよう設定するものです。

今回は:devise_controller?というdeviseのヘルパーメソッド名を指定して、もしdeviseに関するコントローラーの処理であれば、そのときだけconfigure_permitted_parametersメソッドを実行するように設定しています。他のtweetsコントローラーなどでは処理は読み込まれても、実行まではされません。

###その他のコマンドについて

```
rails g migrationコマンド
```
マイグレーションを生成するコマンドです。
マイグレーションはこれまで、rails g modelコマンドでモデルと一緒に生成されていましたが、すでに作成されたテーブルの内容を変更する際などに使用します。

このコマンドは、指定するファイルの名前によって、どのようなテーブル操作を行うかを自動で記述します。

rails g migration Addカラム名To追加先テーブル名 追加するカラム名:型とすることで、テーブルにカラムを追加する際に必要なコードが記述された状態で、マイグレーションが生成されます。

###**スネークケースとキャメルケース**
スネークケースとキャメルケースは、それぞれ単語の区切り方を表したものです。

スネークケースは、単語の区切りをアンダースコアで表す
キャメルケースは、単語の区切りを大文字で表す
変数名や関数名の単語が連立する場合、単語を区切る方法がいくつかあります。
以下の表をみてください。

```
表記方法	説明	例
キャメルケース	先頭が小文字で、単語の区切りを大文字で表す	adminUserCommentCreator
アッパーキャメルケース	キャメルケースの1つ。先頭から単語の区切りを大文字で表す	AdminUserCommentCreator
スネークケース	単語の区切りをアンダースコアで表す	admin_user_comment_creator
```

Railsの慣習的な命名規則として、下記のように使い分けます。

```
命名の対象	慣習的な命名規則
クラス名	アッパーキャメルケース
メソッド名	スネークケース
変数名	スネークケース
```

自分でクラスやメソッドを作成する際には、これらの命名規則は守るようにしましょう。