Method: Devise::Models::Authenticatable#send_devise_notification
- Defined in:
- lib/devise/models/authenticatable.rb
#send_devise_notification(notification, *args) ⇒ Object (protected)
This is an internal method called every time Devise needs to send a notification/mail. This can be overridden if you need to customize the e-mail delivery logic. For instance, if you are using a queue to deliver e-mails (active job, delayed job, sidekiq, resque, etc), you must add the delivery to the queue just after the transaction was committed. To achieve this, you can override send_devise_notification to store the deliveries until the after_commit callback is triggered.
The following example uses Active Job’s ‘deliver_later` :
class User
devise :database_authenticatable, :confirmable
after_commit :send_pending_devise_notifications
protected
def send_devise_notification(notification, *args)
# If the record is new or changed then delay the
# delivery until the after_commit callback otherwise
# send now because after_commit will not be called.
# For Rails < 6 use `changed?` instead of `saved_changes?`.
if new_record? || saved_changes?
pending_devise_notifications << [notification, args]
else
(notification, *args)
end
end
private
def send_pending_devise_notifications
pending_devise_notifications.each do |notification, args|
(notification, *args)
end
# Empty the pending notifications array because the
# after_commit hook can be called multiple times which
# could cause multiple emails to be sent.
pending_devise_notifications.clear
end
def pending_devise_notifications
@pending_devise_notifications ||= []
end
def (notification, *args)
= devise_mailer.send(notification, self, *args)
# Deliver later with Active Job's `deliver_later`
if .respond_to?(:deliver_later)
.deliver_later
else
.deliver_now
end
end
end
193 194 195 196 |
# File 'lib/devise/models/authenticatable.rb', line 193 def send_devise_notification(notification, *args) = devise_mailer.send(notification, self, *args) .deliver_now end |