Access helpers from mailer?
Ruby on-RailsRuby on-Rails-3Ruby on-Rails Problem Overview
I have trying to access helper methods from a rails 3 mailer in order to access the current user for the session.
I put the helper :application in my mailer class, which seems to work, except the methods defined therein are not available to my mailer (i get undefined errors). Does anyone know how this is supposed to work?
Here's my class:
class CommentMailer < ActionMailer::Base
default :from => "Andre Fournier <[email protected]>"
helper :application
end
Thanks, Sean
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
To enable you to access application helpers from the ActionMailer views, try adding this:
add_template_helper(ApplicationHelper)
To your ActionMailer (just under your default :from
line).
Solution 2 - Ruby on-Rails
helper ApplicationHelper
Use class NotificationsMailer < ActionMailer::Base
default from: "Community Point <[email protected]>"
helper ApplicationHelper
helper NotificationMailerHelper
# ...other code...
NOTE: These helper methods are only available to the Views. They are not available in the mailer class (NotificationMailer
in my example).
If you need them in the actual mailer class, use include ApplicationHelper
, like so:
class NotificationMailer < ActionMailer::Base
include ApplicationHelper
# ... the rest of your mailer class.
end
From this other SO question.
Solution 3 - Ruby on-Rails
This is a very old question, but I don't see the full answer, so I will try as I didn't find another resource.
It depends on what you are doing with the methods that have been defined in the helper module. If they are class methods, and everything that's not called on a specific instance seem to be a class methods for 3.2.13, you need to use
extend ApplicationHelper
if an instance methods
include ApplicationHelper
and if you want to use them in a mailer view
helper ApplicationHelper
Solution 4 - Ruby on-Rails
You could try mixing in the required helper module:
class CommentMailer < ActionMailer::Base
include ApplicationHelper
end
Solution 5 - Ruby on-Rails
Josh Pinter's answer is correct, but I discovered that it is not necessary.
What is necessary is to name the helper correctly.
NotificationMailerHelper
is correct. NotificationMailersHelper
(note the s) is not correct.
The class and filename of the helper must match and be correctly spelled.
Rails 3.2.2
Solution 6 - Ruby on-Rails
include ActionView::Helpers::TextHelper
worked for me in the Mailer controller (.rb file). This allowed me to use the pluralize helper in a Mailer controller action (helpers worked fine from the get go in Mailer views). None of the other answers worked, at least not on Rails 4.2
Solution 7 - Ruby on-Rails
If you want to call helper method from ActionMailer you need to include helper (module) in Mailer file as, if Helper module name is “UserHelper”, then need to write following in Mailer file
class CommentMailer < ActionMailer::Base
default :from => "Andre Fournier <[email protected]>"
add_template_helper(UserHelper)
end
Or
class CommentMailer < ActionMailer::Base
default :from => "Andre Fournier <[email protected]>"
include UserHelper
end
Hope this is helpful.
Solution 8 - Ruby on-Rails
The single method version of promoting a method to being a helper that is available in ApplicationController also works in ActionMailer:
class ApplicationMailer < ActionMailer::Base
helper_method :marketing_host
def marketing_host
"marketing.yoursite.com"
end
end
from there you can call marketing_host
from any of your mailer views
Solution 9 - Ruby on-Rails
I'm not sure exactly what you are doing here, but when I want to access current_user from a mailer, I make a mailer method that I pass the user to as an argument:
class CommentMailer < ActionMailer::Base
default :from => "Andre Fournier <[email protected]>"
def blog_comment(user)
@recipients = user.email
@from = "[email protected]"
@sent_on = Time.now
@timestamp = Time.now
@user = user
end
end
With the above, @user, as well as all the other instance variables, are accessible from inside the mailer views ./views/comment_mailer/blog_comment.html.erb and ./views/comment_mailer/blog_comment.text.erb
Separately, you can make a helper called
comment_mailer_helper.rb
and put into that helper any methods that you want to be available to your mailer's views. This seems to me more like what you might want, regarding helpers, because helpers are designed to help views, whereas a mailer is analogous to a controller.
Solution 10 - Ruby on-Rails
None of the *_path
helpers are accessible by default inside of an email. It is necessary instead to use the *_url
form of the wanted helper. So, for instance, instead of using user_path(@user)
it is necessary to use user_url(@user)
.
See at Action Mailer basics.
Solution 11 - Ruby on-Rails
A hackish means of achieving what I wanted is to store the objects I need (current_user.name + current_user.email) in thread attributes, like so: Thread.current[:name] = current_user.name
. Then in my mailer I just assigned new instance variables to those values stored in the thread: @name = Thread.current[:name]
. This works, but it won't work if using something like delayed job.