¿Cómo utilizar mis ayudas de vista en mis vistas de ActionMailer?
Quiero usar los métodos que definí en app/helpers/annotations_helper.rb
mis vistas de ReportMailer (app/views/report_mailer/usage_report.text.html.erb
). ¿Cómo hago esto?
Según esta guía, parece queadd_template_helper(helper_module)
método podría hacer lo que quiero, pero no sé cómo usarlo.
(Por cierto, ¿hay alguna razón para tener acceso a un conjunto diferente de ayudas en las vistas de correo? Esto es bastante molesto).
En la clase de correo que estás utilizando para administrar tus correos electrónicos:
class ReportMailer < ActionMailer::Base
add_template_helper(AnnotationsHelper)
...
end
En Rails 3, simplemente usa el método auxiliar en la parte superior de tu clase ActionMailer:
helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper
Acabo de pasar un bloque, ya que solo lo necesito en un Mailer:
helper do
def host_url_for(url_path)
root_url.chop + url_path
end
end
(asegúrese de configurar config.action_mailer.default_url_options).
(y si usa url_for, asegúrese de pasar :only_path => false)
(Esta es una pregunta antigua, pero Rails ha evolucionado, así que comparto lo que me funciona en Rails 5.2).
Por lo general, es posible que desee utilizar un asistente de vista personalizado para representar la línea de asunto de un correo electrónico, así como el HTML. En el caso de que el asistente de vista esté en app/helpers/application_helper.rb de la siguiente manera:
module ApplicationHelper
def mydate(time, timezone)
time.in_time_zone(timezone).strftime("%A %-d %B %Y")
end
end
Puedo crear una línea de asunto de correo electrónico dinámica y una plantilla que usan el asistente, pero necesito decirle a Rails que use ApplicationHelper explícitamente en apps/mailer/user_mailer.rb de dos maneras diferentes, como puede ver en la segunda y tercera líneas aquí. :
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
Debo mencionar que estas dos líneas funcionan igual de bien así que elige una u otra:
helper :application
add_template_helper(ApplicationHelper)
FWIW, la plantilla de correo electrónico en app/views/user_mailer/party_thanks.html.erb se ve así:
<p>
Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>
Y el controlador app/controller/party_controller.rb se ve así
class PartyController < ApplicationController
...
def create
...
UserMailer.with(party: @party).party_thanks.deliver_later
...
end
end
Tengo que estar de acuerdo con OP (@Tom Lehman) y @gabeodess en que todo esto parece bastante complicado dado https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers , así que tal vez me esté perdiendo algo. .
Para todos los anuncios publicitarios en Rails 3 (configuración del asistente de "aplicación"):
# config/application.rb:
...
config.to_prepare do
ActionMailer::Base.helper "application"
end