deviseについて

Deviseのドキュメントを一通り読んだので、今の自分に必要な部分のみ訳していきました。

#1.deviseの導入
Gemfile.rbに

```Gemfile.rb
gem 'devise'
```

この記述をして、

```terminal
$ bundle install
$ rails g devise:install
```

これだけで、deviseをインストールができます。

#2.deviseのセットアップ
rails g devise:install後、以下のような文章が現れます。

```terminal
Some setup you must do manually if you haven't yet:

  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.

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

       root to: "home#index"

  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>

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

       rails g devise:views
```

1.はメール認証機能を実装したときに、メール認証のメールに記載するURLを設定する部分なので、実際にサービスを運用するときには編集します。deviseのチュートリアルなどを勉強している段階ではあまり関係ないです。

2.はrootのurlを何かしら設定しなさいという内容なので、適当にhomeコントローラーを作って、indexアクションに飛ばしておきます。

```terminal
$ rails g controller home index
```

```config/routes.rb
#rootにhome#indexを追加
root to: "home#index"
```

3.flashメッセージを設定しなさいということなのですが、なくてもこの先に進めます。railsでwebアプリを作っていると、application.html.erbの本文は<% yield %>だけなので、layoutディレクトリにflashメッセージを記述するためのパーシャル(_flash.html.erb)を作って、その中にflashメッセージを表示する記述をしておくといいでしょう。

```_flash.html.erb
<% flash.each do |key, value| %>
  <%= content_tag(:div, value, class: "flash flash_#{key}") %>
<% end %>
```

flashメッセージをapplication.html.erbで描画するために、renderを使って結果を表示します。

```application.html.erb
<body>
  <%= render 'layouts/flash' %>
  <%= yield %>
</body>
```

こんなもんでしょうか。

4.はview画面を作り込みたいときに使用します。

```terminal
$ rails g devise:views
```

これで下準備ができました。ユーザー登録をするために、Userモデルを作成し、データベースを作りましょう。

#3.モデルの作成

```terminal
$ rails g devise User
```

1.の言う通りメール認証を追加するならば、ここでConfirmableをアンコメントアウトしておきます。

```○○○○○○○○○○_devise_create_users.rb
       Confirmable
       t.string   :confirmation_token
       t.datetime :confirmed_at
       t.datetime :confirmation_sent_at
      <img width="982" alt="スクリーンショット 2019-07-28 13.23.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460758/9a233b84-0dff-a80c-384d-01b96e2c6675.png">
 t.string   :unconfirmed_email # Only if using reconfirmable
```

機能を解説しているだけなので、ここは何も追加しません。

```terminal
$ bundle exec rake db:migrate
```

続いてユーザーモデルを編集しましょう。

```user.rb
devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable, :confirmable
#デフォルトではvalidateableまでの5つの記述がありますが、メール認証の機能を追加するために、:confirmableを追加しておきましょう。
```

続いて、index.html.erbに簡単なユーザー登録とログアウトボタンを作ります。

```index.html.erb
<%= link_to "ユーザー登録", new_user_registration_path %>
<%= link_to "ログアウト", destroy_user_session_path, method: "delete" %>
```

これで最低限の機能が実装されましたので、実際にユーザー登録機能を使ってみましょう。

```terminal
$ rails s
```

###devise関連の設定を行ったら、rails sを再度立ち上げること！！！これをしないと、いつまでたっても変更が反映されせん！！！



localhost:3000に接続すると下のような画面が出てきます。
<img width="521" alt="スクリーンショット 2019-07-28 13.16.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460758/4386fa7e-16cd-b83d-38eb-4f75a6bbb3af.png">

ユーザー登録ボタンを押すと、登録画面が現れますので
<img width="500" alt="スクリーンショット 2019-07-28 13.18.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460758/468eeafa-6194-fbd8-b463-7eb568360728.png">

登録後の画面に先ほどの3.で設定した、flashメッセージが出てきます。
<img width="506" alt="スクリーンショット 2019-07-28 13.19.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460758/d448b0d7-d857-8a2a-0905-75987c22d91a.png">

この時点ではまだログインされておらず、登録しようとしたemailアドレスに認証メールを送った段階のため、コンソールを一度確認します。
<img width="982" alt="スクリーンショット 2019-07-28 13.23.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460758/04668f67-9fe4-6bc2-5ae6-789bd29ed79e.png">


吐き出されたメッセージをみてみると、登録したアドレスに認証アドレスを記載したメールを送りましたよとあるので（実装してないので、実際はメールはきません。）、aタグのリンクをコピぺして接続すると

<img width="512" alt="スクリーンショット 2019-07-28 13.26.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460758/d4c03856-890e-b4f2-adb3-9f3def7d4d4d.png">

無事、認証されてログインされました。deviseを導入した時点で、以下のヘルパーメソッドが使えるようになっているので、必要に応じてbefore_actionに付け加えたり、使用しましょう。

```
before_action :authenticate_user!
#オプションでonlyを設定して、ログインしているユーザーにのみ、設定したアクションへのアクセス権限を与える。デフォルトではすべてのアクションにアクセス制限がかかっています。

user_signed_in?
#ユーザーがログイン済みかどうか判定するメソッド。

current_user
#現在ログインしているユーザーの情報を取得する。

user_session
#sessionの情報を取得する。

#userには各自で設定したモデル名が入るので、memberモデルでdeviseを設定したら、member_signed_in?になります。
```

#4.ストロングパラメーターの設定
デフォルトではユーザー情報はemailとpasswordしか（他にもありますが、ユーザーが設定する情報ではないので割愛）ないので、ユーザー名などを追加で設定したいと考える方は大勢いるでしょう。

しかし、モデルに渡すパラメーターは下記のようにdevise側で設定されている状態のため、追加したい場合はdeviseのコントローラーファイルは作成されないため、applicationコントローラー中で、configure_permitted_parametersメソッドを設定して、許可するパラメーターを追加します。

```
#デフォルトでdeviseが設定している、モデルに渡せるパラメーター
POST /users/sign_in => devise/session#create #ユーザーのログイン時
=> emailのみ

POST /users/sign_up => devise/resistrations#create #ユーザー登録時
=> email, password, password_confirmationのみ

PATCH /users => devise/resistrations#update #ユーザー情報の更新時
=> email, password, password_confirmationのみ
```

```application_controller.rb
#パラメーターを追加したい場合
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?
  #deviseに関連するアクションか判定して、trueならばparameterを追加する
  
  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys:[:name])
  end
  #sign_upのルーティングに、:nameのパラメーターを許可する。
end
```

駆け足で解説しましたが、間違っていたらご指摘ください。