はじめに
Rails 6 に追加されそうな新機能を試す第41段。 今回は、 MailDeliveryJob
編です。
Rails 6 では、 ActionMailer::DeliveryJob
を使うと DEPRECATION WARNING
が表示されるようになります。
代わりに ActionMailer::MailDeliveryJob
が用意されています。
Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease
でインストールできます。
$ rails --version
Rails 6.0.0.rc1
- parameterized mail に対応するために、
ActionMailer::Parameterized::DeliveryJob
が導入される。 -
ActionMailer::DeliveryJob
とActionMailer::Parameterized::DeliveryJob
の2つがあるのはややこしいから、1つのクラスActionMailer::MailDeliveryJob
に統合しよう。 - クラスが変わってしまうから、
ActionMailer::DeliveryJob
やActionMailer::Parameterized::DeliveryJob
を使った場合にDEPRECATION WARNING
を表示しよう。
という流れだったみたいです。
今回の準備
今回は、 Rails6 のちょい足しな新機能を試す27(perform_deliveries 編) のソースに手を加えていくことにより動作確認します。
MyMailDeliveryJob を作る
メール送信のジョブを差し変えるため、 MyMailDeliveryJob
クラスを作ります。
このとき派生元のクラスを DEPRECATION WARNING
を出すために、意図的に ActionMailer::DeliveryJob
にします。
class MyMailDeliveryJob < ActionMailer::DeliveryJob
before_perform :logger_info
def logger_info
Rails.logger.info('BEFORE MyMailDeliveryJob perform')
end
end
MyMailDeliveryJob を使う
MyMailDeliveryJob を使うように UserMailer
を修正します。
class UserMailer < ApplicationMailer
self.delivery_job = MyMailDeliveryJob # この行を追加
...
end
ユーザーを登録する
ブラウザから User を登録してメールを送信します。
development.log に DEPRECATION WARNING
が表示されます。また、 MyMailDeliveryJob
を設定したにも関わらず、 ActionMailer::Parameterized::DeliveryJob
が動作していることにも注意してください。
...
[ActiveJob] [ActionMailer::Parameterized::DeliveryJob] [...] DEPRECATION WARNING: Sending mail with DeliveryJob and Parameterized::DeliveryJob is deprecated and will be removed in Rails 6.1. Please use MailDeliveryJob instead. (called from instance_exec at /usr/local/bundle/gems/activesupport-6.0.0.rc1/lib/active_support/callbacks.rb:429)
...
MyMailDeliveryJob クラスの親クラスを変更する
MyMailDeliveryJob の親クラスを ActionMailer::MailDeliveryJob
に変更します。
class MyMailDeliveryJob < ActionMailer::MailDeliveryJob
...
end
再度ユーザーを登録する
ブラウザから User を登録してメールを送信します。
今度は、 DEPRECATION WARNING
も消えて、 MyMailDeliveryJob
が動作していることがわかります。
...
[ActiveJob] [MyMailDeliveryJob] [...] Performing MyMailDeliveryJob ...
[ActiveJob] [MyMailDeliveryJob] [...] BEFORE MyMailDeliveryJob perform
...
結論
ActionMailer::DeliveryJob
や ActionMailer::Parameterized::DeliveryJob
を使っている場合や独自のメール送信ジョブのクラスを作っている場合は、 ActionMailer::MailDeliveryJob
から派生させたメール送信ジョブのクラスに変更するのが良いでしょう。
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try041_mail_delivery_job