2011-11-21 21 views
28

我试图从ActionMailer(Rails 3.1.1)做一个不同模板的条件渲染。我希望大多数用户能够获得正常的welcome.html.erb模板,但有些用户可以获得特殊的welcome_photographer.html.erb模板。这种类型的东西工程的ActionController:为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 

但使不工作 - 每个人都得到标准welcome.html.erb即使@user.is_photographer == true

回答

45

你不应该试图打电话mail()以后做任何事情。但是,要选择另一个模板,您应该通过:template_name作为选项。例如:

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

完美 - 感谢 – brittohalloran

+0

我知道这是现在的一个旧的答案,但我今天发现了它。应该':template_name => template'而不是':template_name =>“template”'?我尝试了你的方式,最后去看它显示为一个字符串的文档。 – Tass

+0

'template'是在第一行设置为字符串的变量。根据用户是否是摄影师,“模板”可以是“welcome_photographer”或“welcome”。 –

8

Sean Hill的解决方案对我无效(Rails 3.2+)。 template_name似乎被忽略。什么工作对我来说是这样的:

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

滑稽的轨道3.2.14这并没有为我工作:

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

但是这并不:

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

当我从另一个不属于邮件程序的子目录中进行渲染时,我找到了带'do'和'format.html'的块。谢谢 – mjnissim