Help us understand the problem. What is going on with this article?

Rails6 のちょい足しな新機能を試す41(MailDeliveryJob 編)

はじめに

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
  1. parameterized mail に対応するために、 ActionMailer::Parameterized::DeliveryJob が導入される。
  2. ActionMailer::DeliveryJobActionMailer::Parameterized::DeliveryJob の2つがあるのはややこしいから、1つのクラス ActionMailer::MailDeliveryJob に統合しよう。
  3. クラスが変わってしまうから、 ActionMailer::DeliveryJobActionMailer::Parameterized::DeliveryJob を使った場合に DEPRECATION WARNING を表示しよう。

という流れだったみたいです。

今回の準備

今回は、 Rails6 のちょい足しな新機能を試す27(perform_deliveries 編) のソースに手を加えていくことにより動作確認します。

MyMailDeliveryJob を作る

メール送信のジョブを差し変えるため、 MyMailDeliveryJob クラスを作ります。
このとき派生元のクラスを DEPRECATION WARNING を出すために、意図的に ActionMailer::DeliveryJob にします。

app/jobs/my_mail_delivery_job.rb
class MyMailDeliveryJob < ActionMailer::DeliveryJob
  before_perform :logger_info

  def logger_info
    Rails.logger.info('BEFORE MyMailDeliveryJob perform')
  end
end

MyMailDeliveryJob を使う

MyMailDeliveryJob を使うように UserMailer を修正します。

app/mailers/user_mailer.rb
class UserMailer < ApplicationMailer
  self.delivery_job = MyMailDeliveryJob # この行を追加
  ...
end

ユーザーを登録する

ブラウザから User を登録してメールを送信します。

development.log に DEPRECATION WARNING が表示されます。また、 MyMailDeliveryJob を設定したにも関わらず、 ActionMailer::Parameterized::DeliveryJob が動作していることにも注意してください。

log/development.log
...
[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 に変更します。

app/job/my_mail_delivery_job.rb
class MyMailDeliveryJob < ActionMailer::MailDeliveryJob
  ...
end

再度ユーザーを登録する

ブラウザから User を登録してメールを送信します。

今度は、 DEPRECATION WARNING も消えて、 MyMailDeliveryJob が動作していることがわかります。

log/development.log
...
[ActiveJob] [MyMailDeliveryJob] [...] Performing MyMailDeliveryJob ...
[ActiveJob] [MyMailDeliveryJob] [...] BEFORE MyMailDeliveryJob perform
...

結論

ActionMailer::DeliveryJobActionMailer::Parameterized::DeliveryJob を使っている場合や独自のメール送信ジョブのクラスを作っている場合は、 ActionMailer::MailDeliveryJob から派生させたメール送信ジョブのクラスに変更するのが良いでしょう。

試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try041_mail_delivery_job

参考情報

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away