diff --git a/app/mailers/devise/mailer.rb b/app/mailers/devise/mailer.rb index 5b8887497c..df07e0f178 100644 --- a/app/mailers/devise/mailer.rb +++ b/app/mailers/devise/mailer.rb @@ -1,88 +1,15 @@ class Devise::Mailer < ::ActionMailer::Base - include Devise::Controllers::ScopedViews - attr_reader :scope_name, :resource + include Devise::Mailers::Helpers def confirmation_instructions(record) - setup_mail(record, :confirmation_instructions) + devise_mail(record, :confirmation_instructions) end def reset_password_instructions(record) - setup_mail(record, :reset_password_instructions) + devise_mail(record, :reset_password_instructions) end def unlock_instructions(record) - setup_mail(record, :unlock_instructions) - end - - private - - # Configure default email options - def setup_mail(record, action) - initialize_from_record(record) - mail headers_for(action) - end - - def initialize_from_record(record) - @scope_name = Devise::Mapping.find_scope!(record) - @resource = instance_variable_set("@#{devise_mapping.name}", record) - end - - def devise_mapping - @devise_mapping ||= Devise.mappings[scope_name] - end - - def headers_for(action) - headers = { - :subject => translate(devise_mapping, action), - :from => mailer_sender(devise_mapping), - :to => resource.email, - :template_path => template_paths - } - - if resource.respond_to?(:headers_for) - headers.merge!(resource.headers_for(action)) - end - - unless headers.key?(:reply_to) - headers[:reply_to] = headers[:from] - end - - headers - end - - def mailer_sender(mapping) - if Devise.mailer_sender.is_a?(Proc) - Devise.mailer_sender.call(mapping.name) - else - Devise.mailer_sender - end - end - - def template_paths - template_path = [self.class.mailer_name] - template_path.unshift "#{@devise_mapping.scoped_path}/mailer" if self.class.scoped_views? - template_path - end - - # Setup a subject doing an I18n lookup. At first, it attemps to set a subject - # based on the current mapping: - # - # en: - # devise: - # mailer: - # confirmation_instructions: - # user_subject: '...' - # - # If one does not exist, it fallbacks to ActionMailer default: - # - # en: - # devise: - # mailer: - # confirmation_instructions: - # subject: '...' - # - def translate(mapping, key) - I18n.t(:"#{mapping.name}_subject", :scope => [:devise, :mailer, key], - :default => [:subject, key.to_s.humanize]) + devise_mail(record, :unlock_instructions) end end diff --git a/lib/devise.rb b/lib/devise.rb index 75383306ca..14ffedfdf9 100644 --- a/lib/devise.rb +++ b/lib/devise.rb @@ -31,6 +31,10 @@ module Encryptors autoload :Sha1, 'devise/encryptors/sha1' end + module Mailers + autoload :Helpers, 'devise/mailers/helpers' + end + module Strategies autoload :Base, 'devise/strategies/base' autoload :Authenticatable, 'devise/strategies/authenticatable' diff --git a/lib/devise/mailers/helpers.rb b/lib/devise/mailers/helpers.rb new file mode 100644 index 0000000000..d45e2242d8 --- /dev/null +++ b/lib/devise/mailers/helpers.rb @@ -0,0 +1,84 @@ +module Devise + module Mailers + module Helpers + extend ActiveSupport::Concern + + included do + include Devise::Controllers::ScopedViews + attr_reader :scope_name, :resource + end + + protected + + # Configure default email options + def devise_mail(record, action) + initialize_from_record(record) + mail headers_for(action) + end + + def initialize_from_record(record) + @scope_name = Devise::Mapping.find_scope!(record) + @resource = instance_variable_set("@#{devise_mapping.name}", record) + end + + def devise_mapping + @devise_mapping ||= Devise.mappings[scope_name] + end + + def headers_for(action) + headers = { + :subject => translate(devise_mapping, action), + :from => mailer_sender(devise_mapping), + :to => resource.email, + :template_path => template_paths + } + + if resource.respond_to?(:headers_for) + headers.merge!(resource.headers_for(action)) + end + + unless headers.key?(:reply_to) + headers[:reply_to] = headers[:from] + end + + headers + end + + def mailer_sender(mapping) + if Devise.mailer_sender.is_a?(Proc) + Devise.mailer_sender.call(mapping.name) + else + Devise.mailer_sender + end + end + + def template_paths + template_path = [self.class.mailer_name] + template_path.unshift "#{@devise_mapping.scoped_path}/mailer" if self.class.scoped_views? + template_path + end + + # Setup a subject doing an I18n lookup. At first, it attemps to set a subject + # based on the current mapping: + # + # en: + # devise: + # mailer: + # confirmation_instructions: + # user_subject: '...' + # + # If one does not exist, it fallbacks to ActionMailer default: + # + # en: + # devise: + # mailer: + # confirmation_instructions: + # subject: '...' + # + def translate(mapping, key) + I18n.t(:"#{mapping.name}_subject", :scope => [:devise, :mailer, key], + :default => [:subject, key.to_s.humanize]) + end + end + end +end \ No newline at end of file