By

ActionMailer::Base.register_observer を使って注文に紐づくメールの送信ログを作成する

Railsの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
一緒にユニークな決済サービスを作ってくれる Rails エンジニアを募集中です!
多国籍なメンバーと一緒に仕事をしてみませんか?詳細はこちらのリンクです:D