【Rails】メール送信機能を実装する(ActionMailer)【DIVE INTO CODE】

更新日:

「DIVE INTO CODE」学習記録 17日目

こんにちは。

17日目。SendGridで本番環境にメール送信機能実装。

学習内容

【ActionMailer】

  • メール送受信の仕組み
  • ActionMailerとは
  • SMTP方式とは
  • SendGridの実装
  • メイラーの作成
  • letter_opener_webの使い方
  • 課題 メール機能作成

【辞書機能】

  • I18nとは(Internationalization)
  • バリデーションエラーメッセージの日本語化

【エラーページ】

  • 404 Not Found(要求されたページが存在しない)
  • 500 Internal Sever Error(Webサーバーの何らかのエラー)
  • ユーザー用エラー画面作成

【シードデータ挿入】

  • シードデータとは
  • Fakerとは

【画像アップロード機能作成】

  • 画像アップロードの仕組み
  • ストレージに画像を保管する方法
  • CarrierWaveとmini_magick
  • キャッシュの利用による画像の復元
  • アップローダファイルとは

 

感想

今回はActionMailerによるメール送信機能の実装を行いました。

前々回がログイン機能、前回がお気に入り機能、そして今回がメール送受信機能。

だんだんとブログアプリがカスタマイズされていきます。

 

そしてだんだんと課題のヒントが少なくなっていきます。

 

メール送受信機能も手こずりました。

今回の課題合格の条件は、

  1. お問い合わせページにメール機能を実装すること。
  2. ブログ作成したときに「投稿完了メール」を投稿したユーザーに送信されるようにすること。

です。

 

「お問い合わせページにメール機能を実装すること。」

 

こっちはまだ簡単です。テキストの通りやっていきます。

事前にお問い合わせ画面も作成していたので、あとはメールが送信される様にするだけです。

 

メール送信機能を実装するにはサーバー上で「メイラー」という機能の実装が必要です。

メイラーを使えばコントローラーと同じ様に使うことができ、メールの送信の設定を行えます。

 

実際に相手の元にメールが届く様にするためには「SendGrid」というクラウドメール送信サービスがまた別で必要になります。(本来はSMTPサーバーを自前で用意するみたいですが、めっちゃ手間かかるみたいです。)

 

「SendGrid」っていうのを使うためにはどうすればいいのか、

 

それはherokuのアドオンを使っての実装です。

 

またヘロクかよ、ってなりますわ。

ヘロク万能だわ、ややこしいだけあるわ。

 

最初テキストにヘロクのアドオンについて書いてあったの読んだとき、

そもそもアドオンの意味がピンときてなかったです。お恥ずかしながら。

 

テキスト見ながらなんとなく覚えながら1つ目の条件はクリア。

 

 

「ブログ作成したときに「投稿完了メール」を投稿したユーザーに送信されるようにすること。」

 

こっちがちょっと悩みました。

先ほどやった1つ目の条件と同じ様にブログ投稿時にメイラーアクションを起動させればいいいいのですが、「投稿したユーザーにメールが送信される」様にする必要があります。

 

ブログ投稿時、実際にユーザーがブラウザから投稿したブログ内容(:titleや:content)を@blog変数に格納して、DBやらViewに飛ばして使います。

ここで大事になってくるのは、「:title」や「:content」だけでなく、@blog変数には「:user_id」が一緒に入っているということ。

というより、前回のお気に入り機能追加の際に一番時間使って悩んで実装した部分です。

 

うまいこと前回と繋がってます。

 

ここでアソシエーションを使うわけです。

 

やることは、

「@blog変数」に入っている、「Blogモデル」で作成された「blogsテーブル」の「:user_idカラム」のユーザーidを元に、

「Userモデル」で作成された「usersテーブル」の「:emailカラム」から投稿者のメールアドレスを引っ張ってくる。

上に書いたことをやるためには、アソシエーションを使わない場合、「find_by」を使う必要があります。

 

@current_user = User.find_by(id: (@blog.user_id))

current_user_email = @current_user.email

 

この式を訳すと、

 

一行目、

「Userモデルに対して、find_byという、後ろの条件(引数)を元に、特定のユーザーをDBから探し出してくれる機能、を使うことで、今投稿したユーザーが特定できるよ。今回の場合は指定されたid:を参考にユーザを特定するよ。指定されたid:は@blogの中に入ってるuser_idだね、特定したよ。その特定したユーザー情報を@current_userに格納したよ。」

 

二行目、

「@current_userに入っているユーザー情報から.emailを抜き出すね。抜き出したemailのみをcurrent_user_emailに格納したよ。」

 

これでユーザーのメールアドレスが「current_user_email」に格納されるはずです。

 

一方でアソシエーションを使って今の作業をやるとどうなるのか。

 

 

current_user_email = @blog.user.email

 

 

これで終わりです。

blogモデルとuserモデルがアソシエーションされていれば、これだけでユーザーのメールアドレスを一発で引っ張ってこれます。便利です。ていうか理解してないと意味わかんないですけど。書いてあるコード読めないです。

 

今回の課題を通して、データベースからの情報の引っ張り方について理解が深まりました。

アソシエーションについても前回よりは理解できたかなと。

 

 

ちょっと長くなってしまったんで、今回はこれくらいにしときます。

書いてて復習になりました。

 

次回の画像アップロード機能搭載も、テキスト見ましたがなかなかノーヒントなので頑張ります。

 

以上ありがとうございました。

-DIVE INTO CODE
-, , , , ,

Copyright© s u p ? , 2019 All Rights Reserved.