40

When I say layout I don't mean just simply the views, I generate those. On all my own mailers I'm using a default layout. Which I define in the SomeMailer.rb file

#some_mailer.rb
class SomeMailer < ActionMailer::Base
  layout 'sometemplate'

Is there some way I can do this for the Devise Mailer et al.?

John Bachir
  • 22,495
  • 29
  • 154
  • 227
holden
  • 13,471
  • 22
  • 98
  • 160

4 Answers4

65

Found the answer sitting in the Devise Github wiki,

Reading that helps. ;-)

config.to_prepare do
  Devise::Mailer.layout "simple" # simple.haml or simple.erb
  Devise::Mailer.helper :mailer
end

Here is the reference of the wiki page: How To: Create custom layouts

djoll
  • 1,139
  • 1
  • 12
  • 31
holden
  • 13,471
  • 22
  • 98
  • 160
  • 12
    Alternatively, you can add `Devise::Mailer.layout "simple"` to the top of your `devise.rb` initializer, before the setup block. – leppert Jul 07 '13 at 17:15
  • Could you clarify what `# email.haml or email.erb` means? Did you mean to write `# simple.haml or simple.erb `? – John Bachir Oct 28 '13 at 19:37
  • Fixed. (The comment should be `# simple.haml or simple.erb` — it's been copied and pasted from the referenced Devise wiki but only the string `"simple"` was customised.) – djoll Mar 16 '14 at 23:29
  • 2
    Use only ```Devise::Mailer.layout "simple"``` . config.to_prepare raises an error in later gem versions. – vladCovaliov Jul 20 '14 at 09:25
  • 1
    This answer is still valid for Devise 3.5, though could use some more information. Note that the `config.to_prepare` needs to go in your `application.rb`, or you can use `Rails.application.config.to_prepare` in `devise.rb`. The link goes into a good amount of detail. – stephen.hanson Sep 22 '16 at 15:28
  • @leppert your comment deserves to be an answer, maybe a top-rated and accepted one as well.. – mzrnsh Nov 09 '16 at 15:37
45

There is also a parent_mailer option in devise.rb, let's say you are sending emails outside of devise, by default this option is set to ActionMailer::Base, but if you have an ApplicationMailer that already is inheriting from ActionMailer::Base, you could change parent_mailer to this and get all your layouts and configurations out of the box.

In any case is a lot cleaner to use this to keep the rails flow of layouts in your applications if you don't want to change anything in the devise mailer controller.

# devise.rb
config.parent_mailer = 'ApplicationMailer'

# application_mailer.rb
class ApplicationMailer < ActionMailer::Base
    layout 'mailer'
end
Alexis
  • 4,836
  • 2
  • 21
  • 27
20
# Devise::Mailer inherits from ActionMailer::Base other mail will work fine.

## app/mailers/deviser_mailer.rb

class DeviseMailer < Devise::Mailer
  layout 'email'
  default from: I18n.t("mailer.default.from")
end

## then in config/initializer/devise.rb

# Configure the class responsible to send e-mails.
config.mailer = "DeviseMailer"

Make sure to restart your rails server as you changed an initializer.

Matt Smith
  • 3,479
  • 2
  • 28
  • 29
-3

Try reopen Devise::Mailer class:

 class Devise::Mailer < ActionMailer::Base
   layout 'sometemplate'
 end
tjeden
  • 2,019
  • 1
  • 13
  • 19
  • didn't work. I also tried several other variations on the Class, but they didn't override the devise template, or non-template – holden Feb 17 '11 at 20:37