lib/devise/async/model.rb in devise-async-0.9.0 vs lib/devise/async/model.rb in devise-async-0.10.1.alpha
- old
+ new
@@ -25,10 +25,16 @@
# processing instead of sending it inline as devise does by
# default.
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
@@ -49,8 +55,25 @@
end
def devise_pending_notifications
@devise_pending_notifications ||= []
end
+
+ private
+
+ 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
+
+ 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
+
end
end
end