ruby-on-rails - rails action mailer
¿Cómo usar mis ayudantes de vista en mis vistas de ActionMailer? (7)
Quiero usar los métodos que he definido en app/helpers/annotations_helper.rb
en mis vistas de ReportMailer ( app/views/report_mailer/usage_report.text.html.erb
). ¿Cómo hago esto?
Según esta guía , parece que el add_template_helper(helper_module)
puede hacer lo que quiera, pero no puedo averiguar cómo usarlo.
(Por cierto, ¿hay alguna razón por la que tenga acceso a un conjunto diferente de ayudantes en las vistas de correo? Esto es bastante molesto).
(Esta es una pregunta antigua, pero Rails ha evolucionado, así que estoy compartiendo lo que me funciona en Rails 5.2).
Por lo general, es posible que desee utilizar un ayudante 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 ayudante 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ámico y una plantilla que ambos usan el ayudante 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 tiene este aspecto:
<p>
Thanks for coming on <%= mydate(@party.created_at, @party.timezone) %>
</p>
Y la aplicación / 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 se siente bastante complicado dado https://guides.rubyonrails.org/action_mailer_basics.html#using-action-mailer-helpers así que tal vez me esté perdiendo algo ... .
En Rails 3, solo use el método auxiliar en la parte superior de su clase de ActionMailer:
helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper
Acabo de pasar en un bloque, ya que solo lo necesito en el único 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)
En la clase de correo que está usando para administrar sus correos electrónicos:
class ReportMailer < ActionMailer::Base
add_template_helper(AnnotationsHelper)
...
end
Para Ruby on Rails 4, tuve que hacer 2 cosas:
(1) Como Duke ya dijo, si el ayudante que quieres agregar es UsersHelper
por ejemplo, entonces agrega
helper :users
a la clase ActionMailer
derivada (por ejemplo, app/mailers/user_mailer.rb
)
(2) Después de eso, recibí un nuevo error:
ActionView::Template::Error (Missing host to link to! Please provide the :host
parameter, set default_url_options[:host], or set :only_path to true)
Para arreglar esto, agregue la línea
config.action_mailer.default_url_options = { :host => ''localhost'' }
a cada uno de los archivos config/environments/*.rb
. Para config/environments/production.rb
, reemplace localhost
con un host más apropiado para las urls generadas por el ayudante de producción.
P: Para el # 2, ¿por qué la vista de correo necesita esta información y las vistas regulares no?
R: Debido a que las vistas regulares no necesitan conocer el host
, ya que todos los enlaces generados se sirven desde el host al que se vinculan. Los enlaces que aparecen en los correos electrónicos no se envían desde el mismo host (a menos que esté enlazando a hotmail.com
o gmail.com
, etc.)
Para todos los remitentes de correo en Rails 3 (configuración de "aplicación" ayudante):
# config/application.rb:
...
config.to_prepare do
ActionMailer::Base.helper "application"
end
Usted puede simplemente agregar en su correo
helper :application
o cualquier ayuda que necesites
en mi caso para Rails4, me gusta esto:
# app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
add_template_helper ApplicationHelper
...
end
y
# app/mailers/user_mailer.rb
class AccountMailer < ApplicationMailer
def some_method(x, y)
end
end
para que no tenga que especificar add_template_helper
todas partes.