¿Cómo usar mis ayudantes de vista en mis vistas de ActionMailer?
Quiero usar los métodos que definí en app/helpers/annotations_helper.rb
en mis vistas ReportMailer (app/views/report_mailer/usage_report.text.html.erb
). ¿Cómo hago esto?
Basado en esta guía parece que el add_template_helper(helper_module)
método podría hacer lo que quiero, pero no puedo averiguar cómo usarlo.
(Por cierto, ¿hay alguna razón por la que obtenga acceso a un conjunto diferente de ayudantes en las vistas de correo? Esto es bastante molesto.)
7 answers
En la clase de correo que está utilizando para administrar sus correos electrónicos:
class ReportMailer < ActionMailer::Base
add_template_helper(AnnotationsHelper)
...
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-29 11:27:29
En Rails 3, simplemente use el método helper en la parte superior de su clase ActionMailer:
helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper
Acabo de pasar en un bloque, ya que solo lo necesito en el one Mailer:
helper do
def host_url_for(url_path)
root_url.chop + url_path
end
end
(asegúrese de establecer config.action_mailer.default_url_options.)
(y si usa url_for, asegúrese de pasar :only_path => false)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 00:37:22
Para todos los correos en Rails 3 (configuración del helper" application"):
# config/application.rb:
...
config.to_prepare do
ActionMailer::Base.helper "application"
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-16 17:12:04
Para Ruby on Rails 4, tuve que hacer 2 cosas:{[13]]}
(1) Como Duke ya dijo, si el ayudante que desea agregar es UsersHelper
por ejemplo, entonces agregue
helper :users
A la clase derivada ActionMailer
(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 URL generadas por el ayudante de producción.
P: Para #2, por qué ¿la vista de correo necesita esta información, y las vistas regulares no?
R: Porque las vistas regulares no necesitan conocer el host
, ya que todos los enlaces generados se sirven desde el host al que enlazan. Los enlaces que aparecen en los correos electrónicos no se sirven desde el mismo host (a menos que esté enlazando a hotmail.com
o gmail.com
, etc.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:43
Solo puede agregar en su correo
helper :application
O cualquier ayudante que necesites
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-10 12:57:47
En mi caso de 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
en todas partes.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-06 09:09:17
(Esta es una pregunta antigua, pero Rails ha evolucionado, así que estoy compartiendo lo que funciona para mí en Rails 5.2.)
Normalmente es posible que desee utilizar un ayudante de vista personalizada para representar la línea de asunto de un correo electrónico, así como el HTML. En el caso de que la vista helper esté en app/helpers/application_helper.rb como sigue:
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 usen el helper, pero necesito decirle a Rails que use el ApplicationHelper explícitamente en apps/mailer/user_mailer.rb de dos maneras diferentes, como se 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 app/controller/party_controller.rb el controlador se ve así
class PartyController < ApplicationController
...
def create
...
UserMailer.with(party: @party).party_thanks.deliver_later
...
end
end
Estoy de acuerdo con OP (@Tom Lehman) y @ gabeodess 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 estoy perdiendo algo...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-08 01:54:38