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?
Basé sur ce guide, il semble que la add_template_helper(helper_module)
puisse faire ce que je veux, mais je ne peux pas comprendre comment l’utiliser.
(BTW, y a-t-il une raison pour laquelle vous avez access à un ensemble différent d’aides dans les vues de mailer? C’est assez ennuyeux.)
Dans la classe de messagerie que vous utilisez pour gérer vos e-mails:
class ReportMailer < ActionMailer::Base add_template_helper(AnnotationsHelper) ... end
Dans Rails 3, utilisez simplement 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, car j’en ai seulement besoin dans le Mailer:
helper do def host_url_for(url_path) root_url.chop + url_path end end
(veillez à définir config.action_mailer.default_url_options.)
(et si vous utilisez url_for, veillez à transmettre: only_path => false)
Pour tous les mailers de Rails 3 (paramétrage de l’assistant “application”):
# config/application.rb: ... config.to_prepare do ActionMailer::Base.helper "application" end
Pour Ruby on Rails 4, j’ai dû faire 2 choses:
(1) Comme déjà dit Duke , si l’aide que vous voulez append est UsersHelper
par exemple, alors ajoutez
helper :users
à la classe ActionMailer
dérivée (par exemple, app/mailers/user_mailer.rb
)
(2) Après cela, j’ai reçu 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 fichiers config/environments/*.rb
. Pour config/environments/production.rb
, remplacez localhost
par un hôte plus approprié pour les URL générées par l’aide à la production.
Q: Pour # 2, pourquoi la vue mail a-t-elle besoin de ces informations et les vues ordinaires ne le font pas?
R: Parce que les vues régulières n’ont pas besoin de connaître l’ host
, puisque tous les liens générés sont servis à partir de l’hôte auquel ils sont liés. Les liens qui apparaissent dans les e-mails ne sont pas diffusés depuis le même hôte (sauf si vous hotmail.com
lien vers hotmail.com
ou gmail.com
, etc.)
Vous pouvez simplement append votre mailer
helper :application
ou quel que soit l’aide dont vous avez besoin
dans mon cas pour Rails4, je fais comme ça:
# 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 n'ayez pas à spécifier add_template_helper
partout.
(Ceci est une vieille question mais Rails a évolué, donc je partage ce qui fonctionne pour moi dans Rails 5.2.)
En général, vous pouvez utiliser un assistant de vue personnalisé pour afficher la ligne d’object d’un e-mail ainsi que le code HTML. Dans le cas où l’assistant de visualisation se trouve dans app / helpers / application_helper.rb, procédez comme suit:
module ApplicationHelper def mydate(time, timezone) time.in_time_zone(timezone).strftime("%A %-d %B %Y") end end
Je peux créer une ligne d’object de courrier électronique dynamic et un modèle qui utilisent tous deux l’aide, mais je dois dire à Rails d’utiliser ApplicationHelper explicitement dans apps / mailer / user_mailer.rb de deux manières différentes, comme vous pouvez le voir ici :
class UserMailer < ApplicationMailer include ApplicationHelper # This enables me to use mydate in the subject line helper :application # This enables me to use mydate in the email template (party_thanks.html.erb) def party_thanks @party = params[:party] mail(to: '[email protected]', subject: "Thanks for coming on #{mydate(@party.created_at, @party.timezone)}") end end
Je devrais mentionner que ces deux lignes fonctionnent tout aussi bien, choisissez l'une ou l'autre:
helper :application add_template_helper(ApplicationHelper)
FWIW, le modèle de courrier électronique à app / views / user_mailer / party_thanks.html.erb ressemble à ceci:
Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
Et le contrôleur app / controller / party_controller.rb ressemble à ceci
class PartyController < ApplicationController ... def create ... UserMailer.with(party: @party).party_thanks.deliver_later ... end end
Je dois être d'accord avec OP (@Tom Lehman) et @gabeodess que tout cela semble compliqué étant donné https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers alors peut-être que je manque quelque chose .. .