deviseを使ったログイン機能　学んだ事まとめ

学んだことを追記していきます。備忘録。

#devise（Gem）導入方法。
【参考】
[Rails deviseで使えるようになるヘルパーメソッド一覧](https://qiita.com/tobita0000/items/866de191635e6d74e392)
[githubのreadme](https://github.com/plataformatec/devise)

user_signed_in?メソッドで、ユーザーがサインインしているかどうか判別したりする。

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

①deviseの設定ファイルを作成

```
$ rails g devise:install
```

<table>
<tr>
  <td>ファイル名</td>
  <td>役割</td>
</tr>
<tr>
  <td>config/initializers/devise.rb</td>
  <td>deviseに関する設定が記述されています。初期設定からカスタマイズする際に編集します。</td>
</tr>

<tr>
  <td>config/locales/devise.en.yml</td>
  <td>バリデーション時エラーメッセージなどが設定されています。デフォルトでは全て英語になっています。</td>
</tr>
</table>


②rails g deviseコマンドでuserモデルを作成


```
$ rails g devise user
```
この時、下記４ファイルが新規作成される
app/models/user.rb
db/migrate/2014XXXXXXXXXX_devise_create_users.rb
test/fixtures/users.yml
test/models/user_test.rb



③rake db:migrateを実行。
これでphpMyAdminにuserテーブルができている筈。

```
$ rake db:migrate
```

#configure_permitted_parametersメソッド

deviseでは初期状態でサインアップ時にメールアドレスとパスワードのみを受け取るようにストロングパラメーターが設定してあるので、追加したキーのパラメーターは許可されていません。追加のパラメーターを許可したい場合は、**application_controller**において[**before_action**](https://qiita.com/weedslayer/items/c3ab7ad37d5a1e325989)に**configure_permitted_parametersメソッド**を設定します。
例えば、ユーザー名も一緒に登録したい等。

【例】

```ApplicationController.rb
class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:ストロングパラメーターを追加したいアクション名, keys: [:追加するキー])
  end
end
```

#current_userヘルパーメソッド
deviseでログイン機能を実装すると、current_userというヘルパーメソッドを使用することができます。これは、現在ログイン中のユーザーのレコードを、userクラスのインスタンスとして取得することができるメソッドです。

#after_sign_out_path_forメソッド
deviseでサインアウトしたあとのリダイレクト先を指定するメソッドとしてafter_sign_out_path_forがあります。このメソッドでは返り値にサインアウト後のリダイレクト先URLを指定します。deiviseのメソッドを上書きしている関係上resourceを引数に渡さなけらばならないので、resourceを引数に渡します。

【例】

```application_controller.rb
def after_sign_out_path_for(resource)
    '/users/sign_in' # サインアウト後のリダイレクト先URL
  end
```

#authenticate_user!メソッド
deviseをインストールすると、ログイン画面とサインアップ画面を自動で用意してくれます。authenticate_user!はdeviseをインストールすることで使えるメソッドです。ユーザーがログインしているかどうかを確認し、ログインしていない場合はログインページにリダイレクトします。通常、before_actionと合わせて使用します。before_actionのexceptやonlyオプションを組み合わせると、特定のアクションを指定することもできます。

```topcontroller.rb
class TopController < ReviewController
  before_action :authenticate_user!, except: :index

  def index
    @tweets = Tweet.includes(:user).page(params[:page]).per(5).order("created_at DESC")
  end

  def create
    Tweet.create(image: params[:image], text: params[:text], user_id: current_user.id)
  end
```

#devise_parameter_sanitizerメソッド
devise_parameter_sanitizerメソッドを使うと、deviseで設定されているstrong_parametersに対してパラメーターを追加することができます。

```rb
devise_parameter_sanitizer.permit(追加したいメソッドの種類, keys: [追加したいパラメーター名])
```


devise_parameter_sanitizerメソッドで指定する引数は2種類あります。
<ul><li>1つ目が「strong_parametersを追加したい処理の種類」です</li>
<li>2つ目の引数には追加したいパラメーター名を渡します。複数のパラメーターを送る場合は,(カンマ)区切りで渡します。</li></ul>

#rails g devise:views
deviseはgemをインストールしただけで、ログイン画面や、新規登録画面が用意されます。
※これらの画面は、deviseのgemの中に記述されているためアプリケーション内で見つけることはできません。

しかし、ほとんどの場合オリジナルでHTMLをカスタマイズして使うケースが多いため、
**rails g devise:views**コマンドでビューファイル群を生成します。