紙一重の積み重ねスマートフォン用の表示で見る紙一重の積み重ねアラフォーのエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。アカウントを有効化するの演習まとめ&解答例です。個人の解答例なので、誤りがあればご指摘ください。本章での学びsendメソッドによるメタプログラミングsendメソッドを使うことで、プログラム内で呼び出すメソッドを動的に決めることができる。「黒魔術」と言われているらしいwrubyリファレンスは以下の通り。して呼び出し、メソッドの実行結果を返します。以下の呼び出し方は、どれもa.lengthを呼び出している。メソッド名を、シンボル:lengthや文字列"length"で指定することで、呼び出すメソッドを動的に指定している。3シンボルや文字列ではなく、メソッド名を直接指定すると、エラーになる。main:Object同様に、ユーザー情報の有効化トークンも、sendメソッドで取得できる。シンボル:activation_digestや、文字列"activation_digest"を指定することで、user.activation_digestを呼び出している。"$2a$10$ufdL0hGRXuEm9biMP3H0deF99cC.BpPrrobGbyL4FQ/QOr0USsdKy"シンボルを指定して、式展開でも取得できる。Railsではシンボルを使うことが一般的。"$2a$10$ufdL0hGRXuEm9biMP3H0deF99cC.BpPrrobGbyL4FQ/QOr0USsdKy"【model】authenticated?メソッドの抽象化Userモデルのauthenticated?メソッド内のdigestを、sendメソッドを使って動的に変化するようにリファクタリングする。sendメソッドに渡すシンボルは、atributeとして引数に追加する。1つの引数であるtokenは他の認証でも使えるように、名称を一般化している。sendメソッドは、self.sendでも呼べるが、Userモデル内であるため省略している。現時点でテストコードはredになる。テストコードでArgumentErrorが発生している。skips【helper】authenticated?を使用するコードの修正ヘルパー内で、authenticated?メソッドの呼び出し方法を修正する。cookies[:remember_token])【test】authenticated?を使用するコードの修正テストコード内で、authenticated?メソッドの呼び出し方法を修正する。end動作確認テストがgreenに変わったことを確認。skips演習1コンソール内で新しいユーザーを作成してみてください。各トークンに対応するダイジェストの値はどうなっているでしょうか?新規ユーザーを作成する。コンソール内でユーザーを作成すると、記憶トークンはnilになる。nil>>>そのため、ユーザー作成後に記憶トークンと記憶ダイジェストを更新する。true記憶トークン、記憶ダイジェスト、有効化トークン、有効化ダイジェストの値を確認。11.26で抽象化したauthenticated?メソッドを使って、先ほどの各トークン/ダイジェストの組み合わせで認証が成功することを確認してみましょう。先ほど生成したユーザーの記憶トークンを使って、認証結果がtrueになることを確認。前章で作成したauthenticated?メソッドを呼び出すeditアクションを作成する。これにより、有効化リンクをクリックした後の処理が完成する。【controller】editアクションの実装AccountActivationsController内のeditアクションを実装する。end【controller】sessionsコントローラの改良ユーザー認証を行うcreateアクションを修正する。有効化に成功しているユーザーのみログインを行い、有効ではないユーザーがログインできないように修正を加える。else動作確認ブラウザを起動して、新規ユーザー(メールアドレスがtest3@example.com)を登録する。送信されたメールの内容を確認。</body></html>有効化URLをクリックする前にログインすると、警告メッセージが表示されることを確認。メール内の有効化URLにアクセスすると、ユーザーが有効化されることを確認。演習1コンソールから、11.2.4で生成したメールに含まれているURLを調べてみてください。URL内のどこに有効化トークンが含まれているでしょうか?有効化トークンが含まれているのは、account_activations/の後ろの部分。https://rails-tutorial-yokoyan.c9users.io/account_activations/aIUAKDQ_Dy-k1ihCxVCs1A/edit?email=test3%40example.com演習2先ほど見つけたURLをブラウザに貼り付けて、そのユーザーの認証に成功し、有効化できることを確認してみましょう。有効化ステータスがtrueになっていることをコンソールから確認してみてください。上記の動作確認を参照。コンソールから有効化ステータスがtrueになっていることを確認。有効化のテストとリファクタリング本章での学びアカウント有効化の統合テストを追加する。end動作確認テストがgreenになることを確認。skips【controller】コントローラのリファクタリング1ユーザー操作の一部を、コントローラからモデルに移す。コントローラ内で、以下の有効化ステータスを更新する箇所を、モデルに移す。Time.zone.now)Userモデルにアカウントを有効にするactivateメソッドを作成する。Userモデル内であるため、user.や、self.は省略できる。end作成したメソッドを呼び出す。user.activate【controller】コントローラのリファクタリング2ユーザー操作の一部を、コントローラからモデルに移す。コントローラ内で、以下の有効化メールを送信する箇所を、モデルに移す。UserMailer.account_activation(@user).deliver_nowUserモデルに有効化メールを送信するsend_activation_emailメソッドを作成する。Userモデル自身が引数となるため、@userは、selfとなる。end作成したメソッドを呼び出す。@user.send_activation_emailリファクタリングの結果確認テストがgreenになることを確認。11.35にあるactivateメソッドはupdate_attributeを2回呼び出していますが、これは各行で1回ずつデータベースへ問い合わせしていることになります。(これでデータベースへの問い合わせが1回で済むようになります)。greenになることも確認してください。activateメソッドを改良する。endテスト結果がgreenになることを確認。skips演習2現在は、/usersのユーザーindexページを開くとすべてのユーザーが表示され、/users/:idのようにIDを指定すると個別のユーザーを表示できます。考えてみれば、有効でないユーザーは表示する意味がありません。11.40のテンプレートを使って、この動作を変更してみましょう8。Recordのwhereメソッドについては、13.3.3でもう少し詳しく説明します。ブラウザのURLを変数すると、アクセスができる。コントローラを改良する。有効なユーザーのみ一覧表示する。両方に対する統合テストを作成してみましょう。endおわりにアカウントの有効化処理が完成しました。日本語であるべき姿を組み立てると書きやすかったです。丸写しするのではなく、あるべき姿を常に考えながら、これからもプログラムを書いていきます。はてなブログProSIerで働く36歳のエンジニアです。自社WEBサービスの開発・AWSのインフラ構築を行っています。なれる最高のフルスタックエンジニアを目指して、RailsやAWSをこつこつ学習中。本を10冊出すことが夢です。PL/SQL」(シーアンドアール研究所)の著者。#振り返りスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。