How do I configure devise to use a custom email layout?
Asked Answered
M

4

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.?

Maharajah answered 15/2, 2011 at 19:39 Comment(0)
M
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

Maharajah answered 18/2, 2011 at 1:17 Comment(6)
Alternatively, you can add Devise::Mailer.layout "simple" to the top of your devise.rb initializer, before the setup block.Roscoeroscommon
Could you clarify what # email.haml or email.erb means? Did you mean to write # simple.haml or simple.erb ?Noakes
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.)Laural
Use only Devise::Mailer.layout "simple" . config.to_prepare raises an error in later gem versions.Arnett
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.Graehme
@Roscoeroscommon your comment deserves to be an answer, maybe a top-rated and accepted one as well..Subsistence
I
46

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
Inventory answered 4/4, 2017 at 6:6 Comment(1)
This is the best answer.Gilges
C
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.

Coelacanth answered 10/8, 2011 at 18:11 Comment(0)
D
-3

Try reopen Devise::Mailer class:

 class Devise::Mailer < ActionMailer::Base
   layout 'sometemplate'
 end
Disconsider answered 15/2, 2011 at 19:55 Comment(1)
didn't work. I also tried several other variations on the Class, but they didn't override the devise template, or non-templateMaharajah

© 2022 - 2024 — McMap. All rights reserved.