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 (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:

class User
  devise :database_authenticatable, :confirmable

  after_commit :send_pending_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.
    if new_record? || changed?
      pending_notifications << [notification, args]
    else
      message = devise_mailer.send(notification, self, *args)
      Remove once we move to Rails 4.2+ only.
      if message.respond_to?(:deliver_now)
        message.deliver_now
      else
        message.deliver
      end
    end
  end

  def send_pending_notifications
    pending_notifications.each do |notification, args|
      message = devise_mailer.send(notification, self, *args)
      Remove once we move to Rails 4.2+ only.
      if message.respond_to?(:deliver_now)
        message.deliver_now
      else
        message.deliver
      end
    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_notifications.clear
  end

  def pending_notifications
    @pending_notifications ||= []
  end
end


187
188
189
190
191
192
193
194
195
# File 'lib/devise/models/authenticatable.rb', line 187

def send_devise_notification(notification, *args)
  message = devise_mailer.send(notification, self, *args)
  # Remove once we move to Rails 4.2+ only.
  if message.respond_to?(:deliver_now)
    message.deliver_now
  else
    message.deliver
  end
end