2009-09-13 7 views
196

Quiero utilizar los métodos que definí en app/helpers/annotations_helper.rb en mis vistas de ReportMailer (app/views/report_mailer/usage_report.text.html.erb). ¿Cómo hago esto?¿Cómo usar mis ayudantes de vista en mis vistas de ActionMailer?

Basado en this guide parece que el método add_template_helper(helper_module) puede hacer lo que yo quiera, pero no puedo encontrar la manera de usarlo.

(Por cierto, ¿hay alguna razón, tendrá acceso a un conjunto diferente de ayudantes en vistas Mailer Esto es bastante molesto?.)

+0

similar - http://amolnpujari.wordpress.com/2013/12/27/highlight-changes-being-made-on-activerecord-object-inside-mail/ –

Respuesta

287

En la clase gestor de correo que está utilizando para gestionar sus correos electrónicos:

class ReportMailer < ActionMailer::Base 
    add_template_helper(AnnotationsHelper) 

    ... 
end 
+6

No funciona para mí con Rails 3.2 . – Dogweather

+4

no funciona para mí en este caso (Rails 3.2.8): Tengo un método definido en ApplicationController y hacer que un ayudante por helper_method: my_helper_wannabe, pero el método "my_helper_wannabe" no estén disponibles en anuncio publicitario. Ver respuesta –

+0

de Duke abajo para saber cómo manejar en Rails 3. –

148

en Rails 3, sólo tiene que utilizar el método de ayuda en la parte superior de su clase ActionMailer:

helper :mail # loads app/helpers/mail_helper.rb & includes MailHelper 

que acaba de pasar en un bloque, ya que sólo lo necesito en el que Mailer:

helper do 
    def host_url_for(url_path) 
    root_url.chop + url_path 
    end 
end 

(asegúrese de ajustar config.action_mailer.default_url_options.)

(y si se utiliza url_for, asegúrese de pasar en: only_path => false)

+12

Hay una pequeña corrección en su respuesta. ayudante: el correo debe ser suficiente. –

+2

Gracias, Satya. ayudante: el correo funciona en Rails 3.2. – Dogweather

+2

Esto funciona, pero se siente incómodo para volver a especificar los ayudantes ya definidos en ApplicationController para las clases individuales de ActionMailer. ActionMailer extiende ActionController para que provengan de una jerarquía común. Más de un comentario sobre rieles que su solución ... – robbie613

29

Para todos los anuncios publicitarios en los carriles 3 (ajuste "aplicación" ayudante):

# config/application.rb: 
... 
config.to_prepare do 
    ActionMailer::Base.helper "application" 
end 
+2

no funcionó para mí en Rails 3.2. – Dogweather

+0

¿Estás seguro? Todavía estoy trabajando en Rails 3.2.8. –

+0

Y todavía funciona para mí en Rails 3.2.14 –

13

Usted puede añadir en su programa de correo

helper :application 

o lo que sea de ayuda que necesita

+4

este es un duplicado de una respuesta anterior - @Shevaun – robbie613

21

Para rubí en los carriles 4, que tenía que hacer 2 cosas:

(1) Como Duke ya se ha dicho, si el ayudante que desea agregar es UsersHelper por ejemplo, entonces añadir

helper :users 

a la clase derivada ActionMailer (por ejemplo, app/mailers/user_mailer.rb)

(2) Después de eso, tiene 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 solucionar este problema, 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 ayuda de producción.


Q: Para # 2, ¿por qué la vista de correo necesita esta información, y las vistas normales no lo hacen?

A: 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 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.)

+0

¿Qué pasa con los nombres compuestos? 'User :: ComposedHelper' –

3

en mi caso para Rails4, hago la siguiente manera:

# 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 

de modo que usted no tiene que especificar add_template_helper en todas partes.

Cuestiones relacionadas