Ruby on Rails 11章アカウント有効化直前まで

投稿者: | 2019年8月23日

Ruby on Rails 11章アカウント有効化直前までをやりました。

●アカウントの有効化
登録→メール送信→URLを踏んだら有効になる
という流れをやる。
パスワードリマインダーみたいな。

アカウントの有効化リソースは、ユーザリソースとは別。
URLをGETで踏んだ時に、アカウントの有効化が必要。

GETしたら(EDITをGET)したらアカウント有効化するので、
ユーザリソースのEDITとは区別する。
・コントローラを作る
・名前付きのルーティングが必要
→URLを踏んだらリソースをEDITするときの、URLをルーティングに登録する。

resources :account_activations, only: [:edit]
(登録するというか1つだけに制限というべきか)

●URL用のトークン
・has_secure_tokenは使わない。
・has_secure_passwordや、ハッシュ化したrememberトークンの要領(+ハッシュ前のトークンをモデルの変数に)
で扱う。

rails generate migration add_activation_to_users activation_digest:string activated:boolean activated_at:datetime

モデル

#仮想的な属性を追加
attr_accessor :remember_token, :activation_token

●有効化トークン、ダイジェストの保存
ユーザオブジェクトに先行して作る必要がある。

before_create :create_activation_digest
※before_saveのように、コールバック

メソッド参照と呼ばれるもので、こうするとRailsはcreate_activation_digest
というメソッドを探し、ユーザーを作成する前に実行するようになる

before_save{ self.email = self.email.downcase }
↓と同じ。
before_save :hoge
def hoge
self.email = self.email.downcase
end

●メールの送信

・テンプレート
rails generate mailer UserMailer account_activation password_reset

ec2-user:~/environment/sample_app (account-activation) $ l app/views/user_mailer/
total 16
-rw-rw-r– 1 ec2-user ec2-user 124 Aug 22 13:40 account_activation.html.erb
-rw-rw-r– 1 ec2-user ec2-user 104 Aug 22 13:40 account_activation.text.erb
-rw-rw-r– 1 ec2-user ec2-user 116 Aug 22 13:40 password_reset.html.erb
-rw-rw-r– 1 ec2-user ec2-user 96 Aug 22 13:40 password_reset.text.erb

メールのテキストとhtmlメールの1セットが2つ。

ec2-user:~/environment/sample_app (account-activation) $ l app/mailers/
total 8
-rw-rw-r– 1 ec2-user ec2-user 102 Jul 23 12:27 application_mailer.rb
-rw-rw-r– 1 ec2-user ec2-user 507 Aug 22 13:40 user_mailer.rb

user_mailer.rb
def account_activation(user)

end

メールのヘッダはここに実装
mail to: user.email
になる。

リンクには、メールアドレスとトークンを含ませる。
メールのボディは

account_activation.text.erb

Hi <%= @user.name %>,
Welcome to the Sample App! Click on the link below to activate your account:
<%= edit_account_activation_url(@user.activation_token, email: @user.email) %>

@userはメールのヘッダを定義していた
user_mailer.rbでインスタンス変数にセットすれば使える。

●メールのプレビュー(test、development)

設定
config/enviornments/development.rb

プレビューファイル
ec2-user:~/environment/sample_app (account-activation) $ l test/mailers/previews/
total 4
-rw-rw-r– 1 ec2-user ec2-user 431 Aug 22 13:40 user_mailer_preview.rb

def account_activation
user = User.first
user.activation_token = User.new_token
UserMailer.account_activation(user)
end

●edit_account_activation_url
呼出し
edit_account_activation_url(@user.activation_token, email: @user.email)

ルーティングの定義
resources :account_activations, only: [:edit]

実行結果
https://省略/account_activations/WB4XUSBi4MPEmeti73WQBQ/edit?email=example%40railstutorial.org

考察
・第1引数に渡したものがIDとして扱われる。
・第1引数がオブジェクトそのものだと、オブジェクトのIDが当たる。
・第2引数以降はGETパラメータになる。

edit_account_activation_url(@user, email: @user.email)の場合
https://省略/account_activations/1/edit?email=example%40railstutorial.org

●メールのテスト(2)
assert_match “str”, mail.body.encoded
assert_match “str”, mail.from
assert_match “/\w+/”, ‘foobar’
のように使える(regexも)

●URLエンコード
CGI.escape(user.email)

●ユーザをCreateしたらメール
users_controller.rbのsave以後に入れる。

UserMailer.account_activation(@user).deliver_now
↑app/mailers/user_mailer.rbのaccount_activationがコール

●rails testしたときのサーバログ
メールの送信ログはここに出る。
tail -n 25 -f log/test.log

コメントを残す

メールアドレスが公開されることはありません。