13
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

参考情報

13
3
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
13
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?