LoginSignup
1
0

More than 5 years have passed since last update.

Mail::Messageをオーバーライドする方法

Posted at

Mail::Messageオーバーライドできない問題

Rails4くらいから、Mail::MessageActionMailer::MessageDeliveryオブジェクトにラップされている為、普通にMail::Messageのメソッドをオープンクラスして上書こうとしてもできないようになっています。
というのも、ActionMailer::MessageDeliveryDelegator
Delegatorは動的に委譲先を設定するので、MessageDelivery.newされた時にクラスが評価されます。
オープンクラスはロード済みのクラスに対してオーバーライドやメソッド追加できる機能なので、この場合オープンクラスできない…ということになるのだと思います…(自信薄)

じゃあどうする

今回の場合delivery自体を上書きたかったので、ActionMailer::MessageDeliveryをオープンクラスしてsuperしました。

パッチ
module ActionMailer
  class MessageDelivery < Delegator
    def deliver
      ...()...
      super
      ...()...
    end
  end
end

ActionMailerの解説は下記が詳しいですが、機能が込み入りすぎてあと10回読み直したい。
ActionMailerは何をしているのか

なお、変にパッチをあてるよりも、Railに乗れるなら本来そっちのがベター。
コールバックやフックもちゃんと準備されています。
Action Mailer の基礎

おまけ

REPLでhoge = Mail::Message.newすると、inspectされるので
ちゃんと上書かれているように見えます。これで余計にハマったのでした。
Railsでの観察者効果

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0