2009-09-13 7 views
196

Je souhaite utiliser les méthodes que j'ai définies dans app/helpers/annotations_helper.rb dans mes vues ReportMailer (app/views/report_mailer/usage_report.text.html.erb). Comment puis-je faire cela?Comment utiliser mes aides à la vue dans mes vues ActionMailer?

Basé sur this guide il semble que la méthode add_template_helper(helper_module) pourrait faire ce que je veux, mais je ne peux pas comprendre comment l'utiliser.

(BTW, est-il une raison pour laquelle vous avez accès à un ensemble différent d'aides en vue mailer Ceci est assez ennuyeux?.)

+0

similaire - http://amolnpujari.wordpress.com/2013/12/27/highlight-changes-being-made-on-activerecord-object-inside-mail/ –

Répondre

287

Dans la classe mailer que vous utilisez pour gérer vos e-mails:

class ReportMailer < ActionMailer::Base 
    add_template_helper(AnnotationsHelper) 

    ... 
end 
+6

Ne fonctionne pas pour moi avec Rails 3.2 . – Dogweather

+4

Ne fonctionne pas pour moi dans ce cas (Rails 3.2.8): J'ai une méthode définie dans ApplicationController et en fait un assistant par helper_method: my_helper_wannabe, mais la méthode "my_helper_wannabe" n'est pas disponible dans mailer. –

+0

Voir la réponse de Duke ci-dessous pour savoir comment gérer dans Rails 3. –

148

dans Rails 3, il suffit d'utiliser la méthode d'assistance en haut de votre classe ActionMailer:

helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper 

Je viens de passer dans un bloc, puisque je ne ai besoin dans une Mailer:

helper do 
    def host_url_for(url_path) 
    root_url.chop + url_path 
    end 
end 

(assurez-vous de mettre config.action_mailer.default_url_options.)

(et si vous utilisez url_for, assurez-vous de passer: only_path => false)

+12

Il y a une correction mineure à votre réponse. assistant: le courrier devrait être suffisant. –

+2

Merci, satya. helper: mail fonctionne dans Rails 3.2. – Dogweather

+2

Cela fonctionne, mais il se peut que vous deviez spécifier à nouveau les aides déjà définies dans ApplicationController à des classes ActionMailer individuelles. ActionMailer étend ActionController afin qu'ils proviennent d'une hiérarchie commune. Plus d'un commentaire sur Rails que votre solution ... – robbie613

29

Pour tous les expéditeurs de courrier dans Rails 3 (réglage aide "application"):

# config/application.rb: 
... 
config.to_prepare do 
    ActionMailer::Base.helper "application" 
end 
+2

Cela ne fonctionnait pas pour moi dans Rails 3.2. – Dogweather

+0

Etes-vous sûr? Je travaille toujours pour Rails 3.2.8. –

+0

Et ça marche toujours pour moi sur Rails 3.2.14 –

13

Vous pouvez simplement ajouter dans votre logiciel de messagerie

helper :application 

ou tout autre aide dont vous avez besoin

+4

Ceci est une copie d'une réponse antérieure - @Shevaun – robbie613

21

Pour Ruby on Rails 4, je devais faire 2 choses:

(1) Comme Duke déjà dit, si l'aide que vous souhaitez ajouter est UsersHelper par exemple, puis ajouter

helper :users 

à la classe dérivée ActionMailer (par ex. app/mailers/user_mailer.rb)

(2) Après cela, je me suis une nouvelle erreur:

ActionView::Template::Error (Missing host to link to! Please provide the :host 
parameter, set default_url_options[:host], or set :only_path to true) 

Pour résoudre ce problème, ajoutez la ligne

config.action_mailer.default_url_options = { :host => 'localhost' } 

à chacun des config/environments/*.rb fichiers. Pour config/environments/production.rb, remplacez localhost par un hôte plus approprié pour les URL générées par l'assistant de production. Q: Pour le n ° 2, pourquoi la vue de courrier a-t-elle besoin de cette information, et les vues normales ne le font pas? R: Parce que les vues régulières n'ont pas besoin de connaître le host, puisque tous les liens générés sont servis à partir de l'hôte auquel ils sont liés. Les liens qui s'affichent dans les e-mails ne sont pas diffusés depuis le même hôte (à moins que vous ne liez hotmail.com ou gmail.com, etc.)

+0

Qu'en est-il des noms composés? 'User :: ComposedHelper' –

3

dans mon cas pour Rails4, je fais comme ceci:

# app/mailers/application_mailer.rb 
class ApplicationMailer < ActionMailer::Base 
    add_template_helper ApplicationHelper 
    ... 
end 

et

# app/mailers/user_mailer.rb 
class AccountMailer < ApplicationMailer 
    def some_method(x, y) 
    end 
end 

afin que vous ne devez pas spécifier add_template_helper partout.

Questions connexes