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を利用した方がアプリとしては良いぐらいの時も多々ある.
結局、何事も適材適所です.