サマリ
- メールの送信とアカウント有効化機能の実装
- メタプログラミング
- SendGridを利用した本番環境でのメール送信
ポイント
-
rails generate mailer
でメーラーの雛形を作成できる- e.g.
rails generate mailer UserMailer account_activation password_reset
- 生成されるHTML/textメーラーのレイアウトは
app/views/layouts
で定義されている
- e.g.
- コントローラー同様、メーラーの中で作成したインスタンス変数はテンプレートの中で使用することができる
- 送信先やメールタイトルなどは
mail
メソッドで指定する- e.g.
mail to:hoge@sample.com
- e.g.
-
deliver_now
メソッドを呼び出すことでメールを送信する- e.g.
UserMailer.account_activation(@user).deliver_now
- e.g.
- 名前付きroot
- 名前付きrootの第一引数は:idになりBase64でエンコードされてURLが生成される
- 第二引数としてハッシュを渡すとURLパラメーターにしてURLを生成してくれる。その際にエスケープも行ってくれる。
- 名前付きrootの引数として指定されたものはコントローラー内で
params[:引数]
でデコードされた状態で取り出すことができる
- 以下を行うとメールのプレビューが有効になる
-
config/environments/development.rb
に以下を追記する -
test/mailers/previews/user_mailer_preview.rb
を修正する - プレビューURLは
https://localhost:3000/rails/mailers/user_mailer/
-
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :test
host = 'localhost:3000'
config.action_mailer.default_url_options = { host: host, protocol: 'https' }
-
assert_match
で正規表現を利用してassertできる -
send
メソッドは引数を評価してから実行するので、メタプログラミング(プログラムによるコードの生成)を行う際に利用される
e.g.
attribute = "foobar"
user.send("#{attribute}_digest")
# => user.foobar_digestが実行される
-
テストの中でのみ
assigns
メソッドを使うと対応するアクション内のインスタンス変数にアクセスできるようになる- e.g.
user = assigns(:user)
=>@userにアクセス可能になる
- e.g.
-
heroku addons:create sendgrid:starter
でherokuにsendgridを導入できる
感想、詰まった箇所など
-
config/environments/development.rb
を書き換えた後にサーバーの再起動を行わなかったせいでMissing host to link to! Please provide the :host parameter,...
というエラーが出てしまい少し詰まった。 - herokuにSendGridを追加した後、画面からユーザー登録を行うとメールが飛ばずに
We're sorry, but something went wrong.
というエラー画面が表示された。ログを確認したところNet::SMTPAuthenticationError (535 Authentication failed: account disabled
となっていた。 - 原因分からず解消しなかったため、herokuの画面からSendGridを「Delete Add-on」した後、再度SendGrid追加しようとしたところ
Error Provisioning User - User status - banned
と表示されてしまった。 - herokuアプリ自体を再作成してからsendgridを再追加することで解消した。