¿Cómo utilizar mis ayudas de vista en mis vistas de ActionMailer?

Resuelto Tom Lehman asked hace 15 años • 8 respuestas

Quiero usar los métodos que definí en app/helpers/annotations_helper.rbmis 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).

Tom Lehman avatar Sep 13 '09 13:09 Tom Lehman
Aceptado

En la clase de correo que estás utilizando para administrar tus correos electrónicos:

class ReportMailer < ActionMailer::Base
  add_template_helper(AnnotationsHelper)

  ...
end
Mark Connell avatar Sep 13 '2009 22:09 Mark Connell

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)

Duke avatar Jun 18 '2011 00:06 Duke

(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. .

MSC avatar Aug 08 '2018 01:08 MSC

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
Edison Machado avatar Jul 16 '2011 17:07 Edison Machado