deviseで送信されるメールを非同期処理にする方法
はじめに
railsで作ったアプリケーションにdeviseを導入していますが、会員登録時などに送信するメールを非同期処理でおこないたいと思います。
メール送信処理でエラーが発生しても画面操作が続けられることがメリットです。
今回は非同期処理にdelayed_job
を使用します。
他にはside_kiq
を使う方法もあります。
前提
- deviseが使用できること。
devise-asyncのインストール
以下のgemをGemfileに追加し、bundle install
してください。
gem 'devise-async'
非同期処理を有効にするため、devise-async.rb
を修正します。
Devise::Async.setup do |config|
config.enabled = true
end
queue_adapter
にdelayed_job
を指定します。
module [アプリ名]
class Application < Rails::Application
# 省略
config.active_job.queue_adapter = :delayed_job
end
end
Mailerをカスタマイズ
以下のようにDevise::Mailerを継承したカスタマイズクラスを作成します。
必要に応じてメソッドをオーバーライドしてください。
Devise::Mailerのメソッド
class UserMailer < Devise::Mailer
default from: '[email protected]'
def confirmation_instructions(record, token, opts = {})
@token = token
devise_mail(record, :confirmation_instructions, opts)
end
end
devise.rb
でカスタマイズしたMailerを指定します。
Devise.setup do |config|
config.mailer = 'UserMailer'
# 省略
end
delayed_jobのインストール
delayed_job
に関するgemをbundle install
します。
gem 'delayed_job_active_record'
# デプロイ先でデーモンとして動かすのに必要
gem 'daemons'
delayed_jobテーブルを作成します。
rails g delayed_job:active_record
rake db:migrate
Jobをスタートさせます。
bin/delayed_job start
正常に起動できているか確認します。
$ ps aux | grep delayed_job
user 16788 0.0 2.2 4621728 183972 ?? S 2:16PM 10:24.78 delayed_job
user 20824 0.0 0.0 4286716 720 s002 S+ 7:34PM 0:00.01 grep delayed_job
Capistranoによるデプロイ
Capistrano用のgemを追加し、bundle install
します。
gem 'capistrano3-delayed-job'
Capfileには以下のrequire文を追加してください。
require 'capistrano/delayed-job'
参考
Author And Source
この問題について(deviseで送信されるメールを非同期処理にする方法), 我々は、より多くの情報をここで見つけました https://qiita.com/shhmd92/items/8b3468def18f300b9bf3著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .