module Devise::Models::Async

Protected Instance Methods

devise_pending_notifications() click to toggle source
# File lib/devise/async/model.rb, line 57
def devise_pending_notifications
  @devise_pending_notifications ||= []
end
send_devise_notification(notification, *args) click to toggle source

This method overwrites devise's own `send_devise_notification` to capture all email notifications and enqueue it for background processing instead of sending it inline as devise does by default.

Calls superclass method
# File lib/devise/async/model.rb, line 27
def send_devise_notification(notification, *args)
  return super unless Devise::Async.enabled

  # The current locale has to be remembered until the actual sending
  # of an email because it is scoped to the current thread. Hence,
  # using asynchronous mechanisms that use another thread to send an
  # email the currently used locale will be gone later.
  args = args_with_current_locale(args)

  # If the record is dirty we keep pending notifications to be enqueued
  # by the callback and avoid before commit job processing.
  if changed?
    devise_pending_notifications << [ notification, args ]
  # If the record isn't dirty (aka has already been saved) enqueue right away
  # because the callback has already been triggered.
  else
    Devise::Async::Worker.enqueue(notification, self.class.name, self.id.to_s, *args)
  end
end
send_devise_pending_notifications() click to toggle source

Send all pending notifications.

# File lib/devise/async/model.rb, line 48
def send_devise_pending_notifications
  devise_pending_notifications.each do |notification, args|
    # Use `id.to_s` to avoid problems with mongoid 2.4.X ids being serialized
    # wrong with YAJL.
    Devise::Async::Worker.enqueue(notification, self.class.name, self.id.to_s, *args)
  end
  @devise_pending_notifications = []
end

Private Instance Methods

add_current_locale_to_args(args) click to toggle source
# File lib/devise/async/model.rb, line 70
def add_current_locale_to_args(args)
  # Devise expects a hash as the last parameter for Mailer methods.
  opts = args.last.is_a?(Hash) ? args.pop : {}
  opts['locale'] = I18n.locale
  args.push(opts)
end
args_with_current_locale(args) click to toggle source
# File lib/devise/async/model.rb, line 63
def args_with_current_locale(args)
  # The default_locale is taken in any case. Hence, the args do not have
  # to be adapted if default_locale and current locale are equal.
  args = add_current_locale_to_args(args) if I18n.locale != I18n.default_locale
  args
end