2011-11-21 9 views
28

Próbuję wykonać warunkowe renderowanie innego szablonu z ActionMailer (Rails 3.1.1). Chcę, aby większość użytkowników otrzymywała zwykły szablon welcome.html.erb, ale niektórzy użytkownicy otrzymali specjalny szablon welcome_photographer.html.erb. Tego typu rzeczy działa w ActionController:Renderuj inny widok (szablon) dla 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 

Ale tynku nie działa - każdy dostaje średnia welcome.html.erb nawet jeśli @user.is_photographer == true

Odpowiedz

45

Nie należy próbować robić coś po wywołaniu mail(). Jednak aby wybrać inny szablon, należy przekazać :template_name jako opcję. Na przykład:

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

idealny - dzięki – brittohalloran

+0

Wiem, że to już stara odpowiedź, ale znalazłem ją dzisiaj. Czy zamiast tego ': template_name => template' powinien być': template_name => "template" '? Wypróbowałem to po swojemu i skończyłem na dokumentach, które pokazują go jako ciąg. – Tass

+0

'template' jest zmienną ustawioną na łańcuch w pierwszym wierszu. Na podstawie tego, czy użytkownik jest fotografem, czy nie, 'template' to' "welcome_photographer" 'lub' "welcome" '. –

8

Rozwiązanie Sean Hill nie działa dla mnie (Rails 3.2+). template_name wydaje się być ignorowany. Co pracował dla mnie jest coś takiego:

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

Funny w szynach 3.2.14 to nie działa dla mnie:

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

Jednak to nie:

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

Znalazłem blok z 'do' i' format.html' pomógł przy renderowaniu z innego podkatalogu, który nie należy do programu pocztowego. Dzięki – mjnissim