Mail::Messageオーバーライドできない問題
Rails4
くらいから、Mail::Message
がActionMailer::MessageDelivery
オブジェクトにラップされている為、普通にMail::Message
のメソッドをオープンクラスして上書こうとしてもできないようになっています。
というのも、ActionMailer::MessageDelivery
はDelegator
。
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での観察者効果