rodrigoalves rodrigoalves - 29 days ago 12
Ruby Question

Rails 4.1 Mailer Previews and Devise custom emails

I have a brand new Rails 4.1.1 app where I'm customizing the Devise emails. I want to have them displayed on the new Rails email preview feature so I did the following:

1) Added the following snippet to my

config/development.rb
file:

config.action_mailer.preview_path = "#{Rails.root}/lib/mailer_previews"


2) Created my custom Devise email
UserMailer
in
app/mailers/user_mailer.rb
:

class UserMailer < Devise::Mailer
helper :application # gives access to all helpers defined within `application_helper`.
include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url`

layout "notifications_mailer"
end


3) Changed
config/initializers/devise.rb
to contain the following snippet:

config.mailer = 'UserMailer'


4) Added the class
UserMailerPreview
to
lib/mailer_previews
with the following content:

class UserMailerPreview < ActionMailer::Preview
def confirmation_instructions
UserMailer.confirmation_instructions(User.first, {})
end

def reset_password_instructions
UserMailer.reset_password_instructions(User.first, {})
end

def unlock_instructions
UserMailer.unlock_instructions(User.first, {})
end
end


So far, so good. Looks like I've done everything right. But then I try to see the preview for the
confirmation_instructions
email at the /rails/mailers/user_mailer/confirmation_instructions route and I get the following error:

undefined method `confirmation_url' for #<#<Class:0x007fa02ab808e0>:0x007fa030fb7e80>


the code for my
confirmation_url.html.erb
template looks like this:

<%= t("notifications.texts.greeting") + @user.display_name %>,

<p>You can confirm your account email through the link below:</p>

<p><%= link_to 'Confirm my account', confirmation_url(@resource, :confirmation_token => @token) %></p>


What am I doing wrong? I guess it is something wrong with the way I call the
confirmation_url
method. Anyone can help me here?

Answer

I found this question because I was trying to figure out how to preview Devise emails myself. I copied your code almost exactly and it works fine for me.

The only thing I did differently was to remove the line layout "notifications_mailer" from UserMailer - when I included it I got an error message Missing template layouts/notifications_mailer. What happens if you remove it?

The line Devise::Controllers::UrlHelpers definitely includes the method confirmation_url (you can see this for yourself by opening up the Rails console and running include Devise::Controllers::UrlHelpers then confirmation_url, so I suspect the problem is that your previews aren't being rendered by UserMailer at all. I'm not sure why, but the line layout "notifications_mailer" might be the culprit.

Do you have a class called NotificationsMailer? Does including Devise::Controllers::UrlHelpers in there solve your problem?

Comments