¿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.)

Author: Koen., 2009-09-13

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
 300
Author: Mark Connell,
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)

 153
Author: Duke,
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
 28
Author: Edison Machado,
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.)

 23
Author: Matt,
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

 18
Author: user1136228,
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.

 5
Author: Yoshi,
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...

 1
Author: MSC,
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