Deviseのメールを非同期で送信する

Ruby on Railsを使った開発に関わっていると、Deviseを利用しているアプリケーションによく出会います.
ここではDeviseの良し悪しはさておき、Gemを利用してDeviseが送信するメールを手軽に非同期送信してみます.

TL;DR

  • devise-asyncというGemを利用する
  • config/initializer/devise_async.rbで設定を書く
  • Deviseを使うARモデルのdeviseの引数に、:asyncを追加する

前提

  • ActiveJobを使った非同期送信の仕組みを、アプリに組み込まれている(Sidekiqなど)
  • Ruby on Rails ... 5.1.4
  • Devise ... 4.3.0

Deviseのメールを非同期送信する

devise-asyncというGemがあります. これをGemfileに定義して、設定を書いて、ARモデルのdeviseの引数に:asyncを追加するだけです.

Gemfileに追記する

これは書かなくてもいいレベルだと思いますが、devise-asyncを定義しましょう.

gem 'devise-async'

devise-asyncの設定を書く

今回は分かり易くするために、config/initializers/devise-async.rbを追加して、ここに書きます.

Devise::Async.setup do |config|
  config.enabled = true
end

deviseの引数に:asyncを追加する

Deviseを使うARモデルのdeviseの引数に:asyncを追加するだけです.
今回は、例としてUserクラスを使います.

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable,
         :async # NOTE: devise-async
end

これで完了です.

最後に

Deviseのメールを非同期で送信する場合の簡単な方法を書きました.
今回の記事を書くために、検証用に作ったアプリは、send-devise-mail-asynchronously-sampleに置いておきました.

今回の記事を書きましたが、Deviseがいいぜっていうわけじゃないです.
私自身、ちょっと前までは「Devise最高!」みたいなタイプの人だったのですが、今ではそれなりに後悔しています.
Deviseだと、やっぱり思想に従って書かないと途端に扱いづらくなるし、もっとシンプルなGemを利用した方がアプリとしては良いぐらいの時も多々ある.
結局、何事も適材適所です.