Rails: 関心の分離の習作: イベントの1日前にメールを送る: 外観

外観

目的

次のお題でRailsアプリを作る。

  • イベント開始日時の1日前に参加する会員にリマインドメールを送る。

  • イベントがキャンセルされた場合、参加者にメールを送らない。

  • イベントの開始日時を変更した場合、既存のリマインダーをキャンセルする。

  • メール送信時に会員が退会(状態が非活性)していればメールを送らない。

環境

ruby 3.1.2
Rails 7.0.4

参照

RailsのER図をMermaidで柔軟に生成できるGemを作りました

主なモデル

  • 会員

  • イベント

  • 予定(会員とイベントの関連付け)

  • メール(送信行為)

ERD


関心の分離

リマインドメール送信に関するコードをReminder Concernで分離する。
この手の名前としてはReminderableの方が良いのかもしれないのですが…

(参照)覚書: Rails: キャンセルなしのスケジュールジョブ|usutani|note
(参照)Code I like (III)- Good concerns

ジョブのキャンセル

ジョブに渡したモデルのキャンセル日時が設定されていればジョブを実行しない。
今回はジョブを削除したりSidekiqのFAQに書かれた方法を使わない。

主なファイル

models/member.rb                        モデル
models/schedule.rb                      モデル
models/event.rb                         モデル
models/event/reminder.rb                関心事
models/event/reminder/mail.rb           モデル(ジョブに渡す)
models/event/reminder/mail_sender.rb    コマンド
mailers/member_mailer.rb                メーラー
jobs/event/reminder/mail_job.rb         ジョブ

実装

  1. Railsアプリを新規作成する。

  2. モデル、メーラー、ジョブの足場を生成する。

  3. イベント、スケジュール、会員のモデルを実装する。

  4. リマインドメールを実装する。

  5. Reminder concernを実装する。

  6. due? possible? canceled?のテストを実装する。

  7. スケジュールジョブを実装する。

リポジトリ

https://github.com/usutani/try_scheduled_mail/commits/main

実装の詳細は複数に分けて次回以降に書く予定です。

今回は以上です。

この記事が気に入ったらサポートをしてみませんか?