🌷

Rails チュートリアル 11章

に公開

まえがき

Railsチュートリアル11章において押さえておいた方がいいポイントをまとめ、11章の学習内容を俯瞰し整理することを目的とする。


変更したファイル

ファイル名 説明
routes.rb アクティベーション用のコントローラを追加したため、resourcesを用いて簡単にルーティング。なお、今回作成するアクションはeditのみである。
seeds.rb サンプルユーザーに関してactivatedをtrueにしておいた。
user.rb authenticated?メソッドを抽象化。activate,send_activation_emailメソッドを追加。
sessions_helper.rb authenticated?に合わせて、引数を訂正。
sessions_controller.rb
users_login_test.rb クラスを作って継承するなどしてリファクタリングした。
users_signup_test.rb クラスを作って継承するなどしてリファクタリングした。
uses_controller.rb この内容をuser.rbでリファクタリングしてスリム化。また、有効なユーザーのみからユーザー一覧が見られるようにindex,showをそれぞれ変更。さらに、createからメーラーを使えるようにした。
account_activations_controller.rb この内容をuser.rbでリファクタリングしてスリム化。
users_index_test.rb 今までのテストをわかりやすく細分化、クラス分けした。また、さらに有効なユーザーのみユーザー一覧を閲覧できるかを確認するテストを加えた。
users.yml 元あったユーザーにactivated,activated_atを追加した。無効なユーザーを追加した。
production.rb mailgunを使うための設定を行なった。
development.rb 開発環境における設定をするファイルであり、ローカル環境において、メールをどのアドレスから送るかを指定した。
test.rb テストのドメインホストに適当な名前をつけた。

追加したファイル

ファイル名 作成方法 説明
<タイムスタンプ>_add_activation_to_users.rb generate migrationで自動作成 activation_digest,activated,activated_atをそれぞれ追加。2番目に関しては一応default:falseと指定しておく。
accout_activation_controller.rb generate controllerで自動作成 アクティベートのためのeditアクションを追加。
users_show_test.rb generate integration_testで自動作成 有効化されたユーザーなら一覧ページ、そうでないならルートページに飛ぶか確認するテスト。
account_activation.text.erb generate mailerで自動作成 認証メールの文面を作成。
account_activation.html.erb generate mailerで自動作成 認証メールにHTMLをつけたものを作成。
application_mailer.rb generate mailerで自動作成 主に、どのメールアドレスから新規ユーザーにメールを送るかを指定する。
user_mailer.rb generate mailerで自動作成 メールの宛先と、題名を指定する。
user_mailer_preview.rb generate mailerで自動作成 メール内容をプレビューするにあたっての動作を記述したファイル。
user_mailer_test.rb generate mailerで自動作成 デフォルトで入っていたメールアドレスを、自身のメールアドレスに変更。

メタプログラミング

メタプログラミングとはプログラミングをプログラムすることを指し、メソッドを抽象化することで汎用性を高める仕組み。sendメソッドを用いることでより汎用的に使うことがきる。sendにおいては以下のような形式を用いることができる。

send
#両者同じ意味
self.send("<文字列>")
self.send(<シンボル>)

#具体例
self.send("example!")
self.send(:example)

このように文字列やシンボルを用いて、メソッドを動的に指定することができるのである。特に、文字列の方、(「""」で囲うもの)には、式展開可能という性質があるため、これを用いることでメタプログラミングを実現する。


メールが送信される流れって?

  1. users_controllerのcreateが呼び出される
  2. 新しいアカウントが作成される
  3. 直後にUserMailerのメソッドが呼び出される(←ここでメール送信)
    メール送信を行なっているのは以下のコード
    user.rb
    UserMailer.account_activation(self).deliver_now
    
    ちなみに、このaccount_activationメソッド(UserMailer内)において宛先や題名を指定している。また、UserMailerはApplicationMailerを継承しており、デフォルトの送り主やレイアウトの指定はしてある。

mailgunを用いた本番環境メール配信

mailgunの無料プランを用いてメール配信を行う場合、あくまで使うことができるのは、mailgunに自ら登録、有効化したメールアドレスに対してのみサーバーからメールを送ることができる仕組みとなる。本番環境とはいえど、動作テスト用と捉えるのが無難。


他にしたこと

  • before_createはインスタンスが作成される前に実行されるものであり、このような使い方をメソッド参照と呼ぶ。
  • 特にそのクラス外で使用しないメソッドに関してはprivateで隠蔽する。
  • 今回の場合、activateを正しく行うために、仮想属性のactivation_tokenをハッシュ化して、activation_digestとしてデータベースに保存することで認証を行う。
  • テストファイルの中のクラス名の最後にTestとついているものは自動でテストされ、そうでないものは明示的に実行する必要があるらしい。ただ、今回は、Testとつかないクラスに関しては主にsetupを設定するために使用している。最低限のテスト実行で済むよう、使い回す必要がありそうなものに関してはクラスとして切り分けた方が良い。
  • deliveries配列とは、ActionMailer環境専用のグローバル配列であり、送信されたメールの情報群が入る。
  • update_attributeで更新を行なってもいいが、複数の更新を多なう場合は、update_columnsを用いる。
  • クエリパラメータとはURLにおいて「?」に続けてキーと値のペアを記述したもの。特殊文字はエスケープしている。

Discussion