このレッスンでは、Deviseでユーザーを作成する方法やMigrationファイルについて学びます。
ユーザーのログイン機能を実装するのは大変なのでDeviseというGemを使用します。
ユーザーの作成
このレッスンでは、Deviseでユーザーを作成する方法やMigrationファイルについて学びます。まず、Userモデルを作成します。ターミナルで以下のコマンドを実行します。
$ rails g devise user
# 以下のファイルが生成される

作成された、Deviseと関連付いているUserモデルを見てみます。モジュールがいくつかあります。その内のいくつかは、コメントアウトされています。その中から、メール認証を行う為に【, :confirmable】というコメントを追加します。

これは、ユーザー登録の後にメールが送られて、メール内のURLをクリックする事で本登録となる仕組みです。
ちなみに、Userモデルですが、モデルフォルダはappフォルダ内のmodelにすべて収納されています。そのため、modelフォルダからUserファイルを探す方法と、WindowsならCtr+e、Macなら⌘+eで検索して目的のファイルを探す方法があります。

次に、20180814071728_devise_create_users.rbを開いて下さい。メール認証に必要な属性を有効にします。
ファイル名の先頭についている【20180814071728】はこのファイルが作られた日時ですので、ファイル作成をした人ごとに違う数字になっています。ファイルを探す際は先ほどと同様に2種類の方法から探すことができます。

この中の以下オレンジ部分をコメントインして下さい。
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
コメントインとはコードの先頭にある#を消してコメントを有効にすることです。ちなみにコードの先頭に#など特定の記号を付けて処理を無効にすることをコメントアウトと言います。

ちなみに# Only if using reconfirmableの部分は注意書きのようなものなので#は外さないままで大丈夫です。
では、migrateしましょう。以下のコマンドを実行します。
$ rails db:migrate
#テーブルが作成される

メールの設定
メール認証の仕組みを利用できるようにしましたが、これだけではメールの送信を行うことは出来ません。Railsアプリでメール送信を行う為の設定が必要になります。どのような設定が必要になるか、Railsアプリでメールの送信を行う時の流れを見ながら確認しましょう。
まず、メールの送受信にはメールサーバーが必要になります。以下のSMTPサーバーとは、メールを送信・配信する為のサーバーです。受信の為のサーバーはPOP3サーバーといいます。この2つは総称してメールサーバーと呼ばれます。

以下は、メールの送信~受信までの流れを図にしたものです。

SMTPサーバーに対して、送信者がメールの送信を依頼します。これは、Railsに標準搭載されているActionMalerという機能を使用して行います。
次に、SMTPサーバーがDNSサーバーに対して受信者のメールサーバーのIPアドレスを問い合わせています。そして、受信者のサーバーのIPが分かったらそのIPを、SMTPサーバーに伝えています。
そして、受信者のPOP3サーバーにメールが送られます。そして最後に、受信者のPOP3サーバーから受信者へメールが送られます。これが、メールの送受信の簡単な流れです。
この中で、準備する必要があるのはActionMailerとSMTPサーバーです。ですが、ActionMailerの設定は、Devise側で既に行われています。ですので今回は、SMTPサーバーの準備のみ行います。
Gmail
SMTPサーバーは、Gmailのものを使用します。その為には、Gmail側とRails側の両方で準備が必要です。まずは、Gmail側での準備を行っていきましょう。
Gmailでは、2段階認証とアプリパスワードの生成を行います。2段階認証とは、ログインの際にアカウント取得時に設定したパスワードの他、登録した電話番号あてに届く、ログインのたびに変更される認証コードの入力を必須とする設定です。
Railsでは、この設定を行っていないとメールの送信が出来ないようになっていますので設定しておきましょう。
また、アプリパスワードとは、2段階認証システムが使えないサービスでGmailへのログインを行う為に必要なパスワードです。
1.では、チュートリアル1で作成したGoogleのアカウントページにログインして下さい。
イメージ右上のアカウントアイコンクリックの後、Googleアカウントをクリックします。

https://myaccount.google.com/intro?hl=ja
2.ログインしたら、ログインとセキュリティに進みます。
セキュリティ設定画面に進みます。

3.2段階認証プロセスをクリックします。
以下赤枠部分です。

4.その次に表示された画面で開始をクリックします。
その後パスワードの入力を行います。

5.2段階認証コードを受け取る為の電話番号を入力します。
コードの取得方法は、どちらでも構いません。

6.次に進むと、テキストメッセージか電話で、コードが届きます。
そのコードを入力して次に進みます。オンをクリックします。

7.左上の矢印をクリックして、メニュー画面に戻ります。
次に、アプリパスワードに進みます。パスワードの入力と、2段階認証コードの入力を行います。

8.アプリを選択というセレクトボックスを展開します。
その他(名前を入力)を選択します。

9.Railsアプリ名を入力します。
生成をクリックします。

お使いのデバイスのアプリパスワードをコピーしてメモ帳などに張り付けておいてください。後ほど使用します。完了をクリックします。これで、Gmailでの準備は完了です。
RailsアプリにSMTPサーバーの設定を追加する
では、Railsアプリ側でSMTPサーバーの設定を行います。deployment.rbを開いてください。そして、以下を参考に記述してください。
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
enable_starttls_auto: true,
port: 587,
domain: 'gmail.com',
user_name: 'Gmailアドレス',
password: 'アプリパスワード',
authentication: :plain
}
まず、config.action_mailer.raise~の部分をtrueに変更します。

変更する事で、メール送信時のエラーを確認できるようになります。そして、サーバーの設定です。

GmailのSMTPサーバーを使用する事、使用する為にパスワードなどを記述してセキュリティチェックを通すことなどを記述しています。
これは、開発環境用の設定でしたのでHeroku用の設定も行いましょう。production.rbを開いて下さい。そして、以下のように追加して下さい。記述する場所はproduction.rbの【Rails.application.configure do】~【end】内のどこでも構いません。
config.action_mailer.default_url_options = { host: 'app-name.herokuapp.com' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
address: 'smtp.gmail.com',
enable_starttls_auto: true,
port: 587,
domain: 'gmail.com',
user_name: 'Gmailアドレス',
password: 'アプリパスワード',
authentication: :plain
}

これで、メールの設定は完了です。
articles_controllerに設定する
ログインユーザーの場合・そうでない場合で、閲覧出来るページを制限してみましょう。ログインユーザーのみarticleのページを閲覧できるように設定します。articles_controllerに以下オレンジ部分を追加します。
# articles_controller.rb
class ArticlesController < ApplicationController
before_action :set_article, only: ...
<span style="color:#e67e22;">before_action :authenticate_user! </span>

では、実際にブラウザで見てみましょう。

以下のようにログイン画面が表示されて閲覧できないはずです。

https://domain/articles
次に、サインアップをしてもう1度見てみましょう。サインアップすると閲覧、作成、削除が可能になります。

次に、ログアウト・ログイン・編集リンクを作成します。index.html.erbに以下を追加して下さい。
<%= link_to "ログアウト", destroy_user_session_path, method: :delete %>
<%= link_to "ログイン", new_user_session_path %>
<%= link_to "編集", edit_user_registration_path %>

ブラウザを更新すると【ログアウト】【ログイン】【編集】リンクが作成されていることが確認できます。
課題
Animalにも認証をかけてみましょう。
これで認証はOKです。次のレッスンでは、Deviseのメソッドについて解説していきます。