2011-11-21 11 views
28

Estoy tratando de hacer un render condicional de una plantilla diferente de ActionMailer (Rails 3.1.1). Quiero que la mayoría de los usuarios obtengan la plantilla normal welcome.html.erb, pero algunos usuarios obtienen la plantilla especial welcome_photographer.html.erb. Este tipo de cosas trabaja en ActionController:Renderizar vista diferente (plantilla) para ActionMailer

# (in /app/mailers/user_mailer.rb) 
def welcome(user) 
    @user = user 
    mail(:to => "#{@user.name} <#{@user.email}>", :subject => "Welcome to ...") 
    render "welcome_photographer" if @user.is_photographer 
end 

Pero la representación no funciona - todo el mundo tiene el estándar welcome.html.erb incluso si @user.is_photographer == true

Respuesta

45

Usted no debe tratar de hacer nada después de llamar mail(). Sin embargo, para elegir otra plantilla, debe pasar :template_name como una opción. Por ejemplo:

template = @user.is_photographer ? "welcome_photographer" : "welcome" 
mail(:to => "#{@user.name} <#{@user.email}>", 
    :subject => "Welcome to ...", 
    :template_name => template) 
+0

perfecta - gracias – brittohalloran

+0

Sé que esta es una respuesta antigua por ahora, pero la encontré hoy. ¿Debería ': template_name => template' ser': template_name => "template" '? Lo intenté a tu manera y terminé yendo a los documentos que lo muestran como una cadena. – Tass

+0

'plantilla' es una variable que se establece en una cadena en la primera línea. Según si el usuario es fotógrafo o no, 'template' es' 'welcome_photographer" 'o' "welcome" '. –

8

La solución de Sean Hill no funciona para mí (Rails 3.2+). template_name parece ser ignorado. Lo que funcionó para mí es algo como esto:

mail(:to => "#{@user.name} <#{@user.email}>", :subject => "Welcome to ...") do |format| 
    format.html { render 'templatename' } 
end 
6

divertido en los carriles 3.2.14 esto no funciona para mí:

mail(:to => "#{@user.name} <#{@user.email}>", :subject => "Welcome to ...") do |format| 
    format.html { render 'templatename' } 
end 

Sin embargo esto:

mail(:to => "#{@user.name} <#{@user.email}>", 
:subject => "Welcome to ...", 
:template_name => template) 
+1

Encontré el bloque con el 'do' y' format.html' ayudado cuando se representa desde otro subdirectorio que no pertenece al programa de correo. Gracias – mjnissim

Cuestiones relacionadas