rails ruby-on-rails

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.