チュートリアル11章

2021.1.18-19

チュートリアル11章

 

登録するときにメールのURLを受信して、登録するようにする。

<流れ>

1 ユーザーの初期状態を「有効化されていない状態」(unactiveated)にしておく。 ユーザー登録が行われたときに、有効化トークンを作成。

2 1で作成した有効化トークン(token)に対応する有効化ダイジェスト(base64などでハッシュ化させたもの)を生成し、DBに保存しておく。

3 有効化トークン(token)はメールアドレスメールアドレスと一緒に、ユーザーに送信する有効化メールのリンクに仕込み送信する。

4 ユーザーがメールのリンクをクリックする。

5 アプリケーションはメールアドレスをキーにして「find_by」でユーザーを探す。

6 DB内に保存しておいた有効化ダイジェストと比較することでトークンを認証する。

7 ユーザーを認証できたら、ユーザーのステータスを「有効かされていない」から「有効化済み」(activated)に変更する。

 

*tokenは特定の人の頭の中や、cookies(ブラウザ)、メールの文面でのみ使用。すぐ忘れる。

*authenticated?で認証する時は2つの情報が必要。

   ❶トークン(token)と❷誰なのか(今回は@user=emailで。)

f:id:mmm_st:20210114132123j:plain

 

--アカウント有効化に必要なリソースやデータモデルを作成--

 

11.1.1 AccountActivationsコントローラ

作業ブランチ作成→コントローラAccountActivationを作成(モデルは作らない)

だが activation_digest,activated(有効化されているかどうか。本人確認が済んでいるか。),activated_at(作成日)のカラムをUserモデルに作る。

 

(route.rb)

resources :account_activations, only: [:edit]

resourcesはonlyオプションを使うことができる。

7つのアクションの中のこのアクションだけ使いますということを表示。

GET /account_activation/トーク/edit edit edit_account_activation_url(token)

トークン = idの場所と同じ。(前の章で使った..ex /users/:id みたいな showでも作ることができる。今回はeditが好ましい)

idに限られているわけではなく、何か数字や文字列を入力することができる。

有効化リンクはメールでユーザーに送られ、それをクリックすると、ブラウザで普通にクリックした時と同じなので、ブラウザから発行されるのは(updateアクションで使うPATCHリクエストではなく)GETリクエストになる。GETリクエストを受けるために(本来updateのところを)editアクションに変更して使っている。 

 

11.1.2 AccountActivationのデータモデル

仮想的な属性を使ってハッシュ化した文字列をDBに保存する。

 

Userモデルにデータモデルを追加

$ rails g migration activation_digest:string activated:boolean activated_at:datetime

 

class AddActivationToUsers < ActiveRecord::Migration[6.0]
def change
add_column :users, :activation_digest, :string
add_column :users, :activated, :boolean, default: false
add_column :users, :activated_at, :datetime
end
end

activatedは、最初はみんな本人確認できていないので、default:falseを設定しておく。

$ rails db:migrate

 

-Activationトークンのコールバック-

(コールバック=必要なタイミングで呼び出せるようにあらかじめ定義しておく関数のこと。before_createなど)

ユーザーが新しい登録を完了するためには必ずアカウントの有効化が必要になるので、有効化トークンや有効化ダイジェストはユーザーオブジェクトが作成される前に作成しておく必要がある。

今回は、オブジェクトが作成された時だけコールバックを呼び出したいので、それ以外の時は呼び出したくない。そこでbefore_createコールバックが必要になる。

 

(定義)

before_create:create_activation_digest

↑メソッド参照と呼ばれる。(before_〇〇みたいに定義する文)

こうすると、railsは「create_activation_digest」というメソッドを探し、ユーザーを作成する前に実行するようになる。

「create_activation_digest」メソッド自体はUser モデル内でしか使わないので、privateより下に記述する。

 

「create_activation_digest」メソッドの中に記入するもの

トークンとそれに対応するダイジェストを割り当てるために...

def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end

 

9章で使った記憶トークンや記憶ダイジェストのために作ったメソッドを使い回ししている。

(user.rb)

#渡された文字列のハッシュ値を渡す
def digest(string)
cost= ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
BCrypt::Engine.cost
BCrypt::Password.create(string, cost: cost)
end
#ランダムなトークンを返す
def new_token
SecureRandom.urlsafe_base64
end
#永続セッションのためにユーザーをセーターベースに記憶する
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end

 

有効かトークンは本質的に仮のものでなければならないので、attr_accessorに「:activation_token」を追加する。

この一文で2つできる

activtion_token             ゲッター

activation_token=(" ") セッター

メールアドレスを小文字にするdowncase_emailメソッドも追加する。

 

class User < ApplicationRecord
attr_accessor :remember_token, :activeation_token
before_save :downcase_email
before_create:create_activation_digest
 
.
.
.
.
.
 
private
 
#メールアドレスを全て小文字にする
def downcase_email
self.email = email.downcase
end
 
#有効化トークンとダイジェストを作成及び代入する
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end

end

 

-サンプルユーザーの生成とテスト-

文面確認すれば理解できる。

 

railsのデータを記述ファイルは2つある。(必ず使われるという決まりはない。)

・db/seeds.rb =アプリケーション動作に必要なデータを記述するファイル

マスターデータを新規登録したりするのに使う。(ex.部署一覧(部署マスタ)、郵便番号一覧、勘定科目一覧、カテゴリ一覧など)

$ rails db:seedを実行すると読み込まれ実行される。

 

・test/fixtures/* (ex.users.yml) =動作確認用のデータを入れるファイル

$ rails testでminitest(テスト)を実行する際に使われるデータ。

 

マスターデータ:システムを使う前から入れておくデータ

トランザクションデータ:システムを使っていると増えていくデータ, 

 

 

11.2 アカウント有効化のメール送信

--メイラー(mailer)  (=ほとんどコントローラー)--

MVCのViewとcontrollerの部分をView(mail📨)とcontrolle(mailer📮)に置き換えて使う。modelはその都度必要であれば連携する。

 

メールに記載すること

❶ 📨 = @user.email

❷ 🔑 = @user.activation_token

→ /account_activations/🔑/edit?email=📨

 

11.2.1 送信メールのテンプレート

rails g mailer UserMailer account_activation password_reset

account_activationメソッドとpassword_resetメソッドが作られる。

viewが2つずつ生成される。(テキストメール用のテンプレート、HTMLメール用のテンプレート  対応していないユーサーがいないように。)

 

(メイラー)

UserMailerの上にApplicationMailerがいる。

メイラー全体でやりたいことはApplicationMailerに入力してしまう。

ex)ノーリプライ❶ レイアウト❷

class ApplicationMailer < ActionMailer::Base
default from: 'noreply@example.com' #❶
layout 'mailer' #デフォルトでのレイアウトファイルを指定❷先ほどできた
viewファイルのこと(mailer.html.erb)
end

 

class UserMailer < ApplicationMailer
def account_activation(user)
@user = user #インスタンス変数が
mail to: user.email,subject(subject=メールの件名):"Account activation"
#先ほど作成した2つのファイル(mailer.text.erb or mailer.html.erb)内で
インスタンス変数(@user)が展開され、mail(メール)で呼び出せる。
end

def password_reset
@greeting = "Hi" #インスタンス変数が
 

mail to: "to@example.org" #先ほど作成した
2つのファイル(mailer.text.erb or mailer.html.erb)内で
インスタンス変数(@user)が展開され、mail(メール)で呼び出せる。
end
end

生成された、「def account_activation(user) end」と「def password_reset end」の中に@userと@greetingが含まれている。= 普通のviewでコントローラーのインスタンス変数を利用できるのと同じように、メイラーのビューでも使用可能。

「def account_activation(user) end」と「def password_reset end」は、ただのメソッドという認識。アクションとの違いは、引数渡せる、渡した結果をまとめてメールオブジェクトにして、returnする。

 

#account_activation.html.erbの場合
<h1>Sample App</h1>

<p>Hi <%= @user.name %>,</p>

<p>
Welcome to the Sample App! Click on the link below to activate your account:
</p>

<%= link_to "Activate", edit_account_activation_url(@user.activation_token,
email: @user.email) %>
 
#account_activation.text.erbの場合
.
.
.
<%= edit_account_activation_url(@user.activation_token, email: @user.email)%>
 

 

名前付きルート:edit_account_activation_url(token)

edit_account_activation_url(@user.activation_token, email: @user.email) %>

idではなく、今回はtokenがURLに入って欲しいので指定🔑。これで入る。

URLパラメータ(email: @user.email)も指定。URLパラメータ=サーバーへ情報を送るためにURLに付け加える変数。

これによって、

/account_activations/🔑/edit?email=📨 の部分ができる。GETで送受信するのでeditが反応してくれる。

 

URLエスケープ

URLで使えない文字(" ",@,日本語など)については「%」を使って表現される。

ex)"foo%40example.com" ("foo@example.com")

 

11.2.2 送信メールのプレビュー

railsでは特殊なURLにアクセスするとメールのメッセージをプレビューすることが可能。

 

❶development環境の設定を変更 (localhostの場合)

(config/environments/development.rb)

host = 'localhost:3000' #ローカル環境
config.action_mailer.default_url_options = { host: host, protocol: 'http' }

 

❷11.2で自動作成したUserメイラーのプレビューファイルを更新する。

(test/mailers/previews/user_mailer_preview.rb)

# Preview this email at
  # http://localhost:3000/rails/mailers/user_mailer/account_activation
  def account_activation
    UserMailer.account_activation
  end

↑『11.2.1 送信メールのテンプレート』で$rails g mailer UserMailer account_activation password_reset で作成したaccount_activationメイラーメソッドの引数に有効なオブジェクトを渡す必要があるので、これでは動かない。

 

user.activation_token の値に『11.1.2 AccountActivationのデータモデル』で定義しているnew_tokenメソッドを代入している。(account_action.text.erbとaccount_activation.htnl.erbでactivation_tokenを使用しているから必要。省略不可。)

❷user変数が開発用DBの最初のユーザーになるように定義して、(❸別に最初のユーザーでなくてもいいが、一番簡単なので最初のユーザー)UserMailer.account_activationの引数として渡す。 

こう変更する↓

(test/mailers/previews/user_mailer_preview.rb)

/user_mailer/account_activation
def account_activation
user = User.first ❸
user.activation_token = User.new_token ❶
UserMailer.account_activation(user) ❷
end

 rails serverを起動させ、

http://localhost:3000/rails/mailers/user_mailer/account_activation

を検索するとプレビューが見れる。

 

11.2.3 送信メールのテスト

メールプレビューのテストを作成する。

(test/mailers/user_mailer_test.rb)

require 'test_helper'

class UserMailerTest < ActionMailer::TestCase
test "account_activation" do
user = users(:michael)❶
user.activation_token = User.new_token❷
mail = UserMailer.account_activation(user)❸
assert_equal "Account activation", mail.subject❹
assert_equal [user.email], mail.to ❺
assert_equal ["noreply@example.com"], mail.from ❻
assert_match user.name, mail.body.encoded ❼
assert_match user.activation_token, mail.body.encoded ❼
assert_match CGI.escape(user.email), mail.body.encoded ❼❽
end

end

11.2.2と同じ流れ

❶fixtureファイルからmichaelのアカウントを引っ張ってくる。

❷token情報を入れる

❸メイラーメソッドを呼び出す= メールオブジェクト(mailの代入されて)が戻り値として返ってくる。=これをテストする。

❹件名の確認

❺メールの宛先を確認する。

❻どこから送られてきたのか。

❼メールのボディに存在するか。.encoded:データを他の形式に変換すること。

❽ユーザーのemailの中の@がエスケープ(escape)されてURLで使える文字列がmailのbodyに入っているか確認。「.encoded」によって変換させている。(今回は@を%40へ。)

*「.encoded」:データを他の形式に変換すること

ex)日本語を英語に書き直すようなイメージ (デコードはその逆=元に戻す)

 

テストファイル内のドメイン名を正しく設定する。

(config/environments/test.rb)

config.action_mailer.delivery_method = :test #←もともとある
config.action_mailer.default_url_options = { host: 'example.com' }

 

メイラーのみテストするときは

$ rails test:mailers

を実行する。

 

11.2.4 ユーザーのcreateアクションを更新(signup時のcrateアクションを更新)

・現状、signup直後にログインできるようになっていたができないようにし、メールをチェックするようにflashで表示する。

(app/controllers/users_controller.rb)

def create
@user = User.new(user_params)
if @user.save ❷
UserMailer.account_activation(@user).deliver_now ❸
flash[:info] = "Please check your email to activate your account."
redirect_to root_url ❶
else
render 'new'
end
end

❶ リダイレクト先をルートURL(root_url 最初のページlocalnost:3000の所)に変更する。

 ❷ @user = 空のインスタンスsaveが発生しているので、

この時点でUserモデル(app/models/user.rb)の中の

before_create :create_activation_digest

が発生している。

#有効化トークンとダイジェストを作成及び代入する
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
end

= activation_tokenを作成し、activation_digestをDBに保存という一連の流れがこの時点で完了している。

UserMailer.account_activationを呼び出す頃には@userというインスタンスオブジェクトはセッターメソッド(activation_token =)を通してtokenがセットされている。= メールオブジェクトが出来上がっている。

 

UserMailer.account_activationメソッドを呼び、@userを引数で渡しメールオブジェクトを返り値として得る。「deliver_now」で「今メールを送る」が実行される。(メールオブジェクトに対して。)

 

この状態で実践し、どこにメールが飛ぶのか...

開発環境の設定は rails server の中のログの中(=サーバーログ)に出てくる。(ターミナルに勝手に出力してくれている。)

f:id:mmm_st:20210117233421p:plain

メールに送られてくる「http://localhost:3000/account_activations/puTfPbCiELcaA3odPiAUDg/edit?email=1234%40gmail.com」をクリックするとAccountActivationsコントローラーのeditアクションに連動される。(まだ定義していないが...)

 

11.3 アカウントを有効化する

--authenticated?メソッドを使って実際にアカウントを有効化する部分を実装--

authenticated?(token🔑を渡す)

(11.2.1参照↓)

*new_tokenメソッドで生成されたものは、Base64エンコードされ、user/1/editの「1」のようなユーザーIDと同じ役割を果たす。このトークンはAccountActivationsコントローラーのeditアクションではparamsハッシュでparams[:id]として参照できる。

*名前付きルートでパラメーターを定義すると、railsが特殊な文字を自動的にエスケープしてくれ、コントローラーでparams[:email]からメールアドレスを取り出すときには、自動的にエスケープを解除してくれる。

 

11.3.1 authenticated?メソッドの抽象化

f:id:mmm_st:20210118034444j:plain

*式展開は"文字列"でしか展開しない。

 

メタプログラミング:「プログラムでプログラムを作成する」rubyの機能。今回はsendメソッドが重要になる。

sendメソッド:渡されたオブジェクトに「メッセージを送る」ことによって、呼び出すメソッドを動的に決めることができる。

=引数に渡したデータをベースにしてそのオブジェクトに渡せる。 

*シンボルでも文字列でも書ける。

ex) rails console  

>@user.send :name

=>"Example User"

 

>attribute = :activation #"activation"でも可。Rubyではシンボルが一般的。シンボルでも文字列でも文字列に展開される。(シンボルは式展開され文字列になる7.4.2参照)

> @user.send "#{attribute}_digest"   #これができるようになる。

=>"$2a$12$/9MIDKSsc........"

 

(app/models/user.rb)

#渡されたトークンがダイジェスト(digest)と一致したらtrueを返す
def authenticated?(attribute, token)
digest = send("#{attribute}_digest") #self.sendのselfは省略されている。
return false if digest.nil?
BCrypt::Password.new(digest).is_password?(token)
end

これによってこのように呼び出すことによってauthenticated?の従来の振る舞いを再現できる。「user.authenticated?(:remember,remember_token)」

 

この後、古いままのauthenticated?メソッドをなおす。

 

 

11.3.2 editアクションで有効化

AccountActivationsコントローラーのeditアクショを書く

(app/controllers/account_activations_controller.rb)

class AccountActivationsController < ApplicationController
def edit
user = User.find_by(email: params[:email]) ❶
if user①
&& !user.activated?②
&& user.authenticated?(:activation, params[:id])③ ❷
#元は1行解説のために改行した
user.update_attribute(:activated, true) ❸
user.update_attribute(:activated_at, Time.zone.now) ❹
log_in user ❺
flash[:success] = "Account activated!"
redirect_to user ❻
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end
end

 ユーザーがURLをクリックし、emailとtokenの情報が手に入っているので認証する。認証の準備も終わっている。(メタプロで)

❶届いたemailでユーザーを見つける

❷左から実行していく。

 ①userでnilか確認

 ②userがそもそもactivatedされているか?

 「! 」がついているので、「userがそもそもactivatedされていませんよね?」

  (2回3回...とURLをメールボックスからクリックされた時を想定。1回目で    activated(=有効化)されているはずなので2回3回...目は無効化されています。)

 ③GETリクエスト /account_activations/:id/edit

  :acutivation (=一つ前でメタプロで定義したものが発生する。

        今回はactivation_dogest)

        params[:id] (= 今回はtokenがはいる)

❸ activated trueになる

❹ activated_atが今の時間が書き込まれる

❺ログイン

❻プロフィールページに移動

 

ユーザーがactivated(有効化)された時のみにログインできるようにする。

user.activated?がtrueの時のみログインを許可。それ以外はルートURLにリダイレクトしてwaeningで警告する。

(app/controllers/sessions_controller.rb)

def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
if user.activated? #activated(有効化されていますか?)
log_in user
params[:session][:remember_me] == '1' ? remember(user) : forget(user)
redirect_back_or user
else #activated(有効化)していなければ...
message = "Account not activated. "
message += "Check your email for the activation link." #a+=b a=a+b
flash[:warning] = message
redirect_to root_url
end
else
flash.now[:danger] = 'Invalid email/password combination'
render 'new'
end
end

 

 

11.3.3 有効化のテストとリファクタリング

(test/integration/users_signup_test.rb)

def setup
ActionMailer::Base.deliveries.clear
end
.
.
.
test "valid signup information with account activation" do
get signup_path
assert_difference 'User.count', 1 do #アカウントの数が1こ増える
post users_path, params: { user: { name: "Example User",
email: "user@example.com",
password: "password",
password_confirmation: "password" } }
end
assert_equal 1, ActionMailer::Base.deliveries.size
user = assigns(:user)
assert_not user.activated?
# 有効化していない状態でログインしてみる
log_in_as(user)
assert_not is_logged_in?
# 有効化トークンが不正な場合
get edit_account_activation_path("invalid token", email: user.email)
assert_not is_logged_in?
# トークンは正しいがメールアドレスが無効な場合
get edit_account_activation_path(user.activation_token, email: 'wrong')
assert_not is_logged_in?
# 有効化トークンが正しい場合
get edit_account_activation_path(user.activation_token, email: user.email)
assert user.reload.activated?
follow_redirect!
assert_template 'users/show'
assert is_logged_in?
end
end
#assert_template 'users/show'
#assert is_logged_in?
end

 

 

assert_equal 1, ActionMailer::Base.deliveries.size

↑メールオブジェクト(配信されたメッセージ)を1個作成していますよね?

*今までのテストにメールオブジェクトが残っていいたら個数が変な風になってしまいエラーが発生してしまう。

 

↓のでsetupメソッドでdeliveries.clearを行いsize(個数)を初期化(clear)する。

def setup
ActionMailer::Base.deliveries.clear
end

 

assignsメソッド:対応するアクション内のインスタンス変数 (今回は@user)にアクセスし、中身を持ってくる。アプリケーションコード(controllerやmodel)の中のインスタンス変数。

(users_controller.rb)

def create
@user = User.new(user_params) ❷
if @user.save
UserMailer.account_activation(@user).deliver_now
flash[:info] = "Please check your email to activate your account."
redirect_to root_url
else
render 'new'
end

(users_signup_test.rb)

user = assigns(:user) ❶
assert_not user.activated? ❸

assigns(:user)❶ で @user❷ にアクセスできる。

❶空のインスタンス(idなどを含んでいない)にname,email,password,password_confamationなどが入っているまだvalidationを通していないuserオブジェクトのデータがテストの世界に呼び出すことができる。

❸ここではまだactivated(有効化)されていない

 

AccountActivationsコントローラーから Userモデルにコードを移していく(リファクタリング)他のエンジニア、時間が経ってからの自分が読みやすいように変更する。

 

Userモデルにユーザー有効かメソッドを追加する

(app/models/user.rb)

class User < ApplicationRecord
.
.
# アカウントを有効にする
def activate
update_attribute(:activated, true)
update_attribute(:activated_at, Time.zone.now)
end

# 有効化用のメールを送信する
def send_activation_email
UserMailer.account_activation(self).deliver_now
#このselfは@userがselfに変更されている
end
 
private
.
.
.
end

 

ユーザーモデルオブジェクトからメールを送信する

(app/controllers/users_controller.rb)

def create
@user = User.new(user_params)
if @user.save
@user.send_activation_email
flash[:info] = "Please check your email to activate your account."
redirect_to root_url
else
render 'new'
end
end

 

 

ユーザーモデルオブジェクト経由でアカウントを有効化する

(app/controllers/account_activations_controller.rb)

class AccountActivationsController < ApplicationController
def edit
user = User.find_by(email: params[:email])
if user && !user.activated? && user.authenticated?(:activation, params[:id])
user.activate
log_in user
flash[:success] = "Account activated!"
redirect_to user
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end
end

 development環境におけるアカウントの有効化の流れは完成。

 

11.4 本番環境でのメール送信

production環境で実際にメールを送信できるようにする。

本番環境からメールを送信するために「Mailgun」というHerokuアドオン(=後から追加できる拡張機能)を利用し、アカウントを検証する。

 

--メールの設定を書き足す--

mailgunアドオンを使用する為に、production環境のSMTP(インターネッ路で電子メールを送信するプロトコル)情報を記入する必要がある。

→本番Webサイトのアドレスをhost変数に定義する。

 <your heroku app>を自分のHerokuのURLにする。

$ heroku info で自分の情報が確認できる

(config/environments/production.rb)

config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
host = 'murmuring-escarpment-43116.herokuapp.com' #ここを自分のURLに
config.action_mailer.default_url_options = { host: host }
ActionMailer::Base.smtp_settings = {
:port => ENV['MAILGUN_SMTP_PORT'],
:address => ENV['MAILGUN_SMTP_SERVER'],
:user_name => ENV['MAILGUN_SMTP_LOGIN'],
:password => ENV['MAILGUN_SMTP_PASSWORD'],
:domain => host,
:authentication => :plain,
}

 

 

 

Gitのトピックブランチをmasterにマージする。

$rails test

$git add -A

$git commit -m "Add account activation"

$git checkout master

$git merge account-activation

Gitのリモートリポジトリにプッシュし、Herokuにデプロイする。

$rails test

$git push

$git push heroku

$heroku run rails db:migrate

 

 

MailgunのHerokuアドオンを追加するために次のコマンドを実行

$ heroku addons:create mailgun:starter

 

 

--メールの認証--

以下のコマンドを打つとMailgunダッシュボード(様々なデータ情報をまとめて一覧表示するツール)のURLが表示されるのでブラウザで開く。

$ heroku addons:open mailgun]

 

画面左の[settiong]→[Domains]のリストにある[sandbox]で始まるサンドボックスドメインを選択。画面右の[Authorized Recipients]から受信メールアドレスを認証。本番環境でのメール送受信準備は完了。

 

この受信認証したメールアドレスを使用し、production環境(git push herokuで実行した際に出てくる。~~~herokuapp.comターミナルに出てくる。rails serverの方ではない)でユーザー登録を行う。

 

普通にサイトを開いて、アカウントを作成すると、登録したemailにメールが届く。

 

 <まとめ>

・アカウントの有効化はActiveRecordオブジェクトではないが、セッションの場合と同様にリソースでモデル化できる。

Railsはメール送信で扱うActionMailerのアクションとビュー(2種:テキストメールとHTMLメール)を作成、利用できる。

・メイラーアクションで定義したインスタンス変数は、他のアクションやビューと同様にメイラーのビューから参照できる。

 ・アカウントを有効かさせるために、生成したトークンを使って一意のURLを作る。

・より安全なアカウント有効化のために、ハッシュ化したトークン(ダイジェスト)を使う

・メイラーのテストと統合テストは両方とも Userメイラーの振る舞いを確認するのに有用。

・Mailgunを使うと、production環境からメールを送信できる。