ActionMailer::Base.register_observer を使って注文に紐づくメールの送信ログを作成する
TweetRailsのTipsです。バージョンは Rails 4.2.0 + Ruby 2.2.0p0 になります。
ECストアの開発・運営しているとお客様へ送信したメールの履歴を確認したい時があります。 そういったメールの送信ログを作成する時 ActionMailer::Base.register_observer メソッドを使うと綺麗にクラスを分離できて便利です。
class Order < ActiveRecord::Base
def after_complete
OrderMailer.register_observer(EmailLogObserver.new(self))
OrderMailer.confirmation_email(self).deliver_now
end
end
class OrderMailer < ActionMailer::Base
def confirmation_email(order)
mail(subject: "subject", from: "from", to: "to")
end
end
class EmailLogObserver
attr_reader :order
def initialize(order)
@order = order
end
def delivered_email(email)
EmailLog.create!(order: order, email: email)
end
end
ちなみにこの機能は ActionMailer 独自の機能ではなく、Mail クラスのメソッドを ActionMailer がラップしている機能になります。
def register_observer(observer)
delivery_observer = case observer
when String, Symbol
observer.to_s.camelize.constantize
else
observer
end
Mail.register_observer(delivery_observer)
end