为ActionMailer渲染不同的视图(模板)

bri*_*ran 35 ruby-on-rails actionmailer ruby-on-rails-3

我正在尝试从ActionMailer(Rails 3.1.1)中进行不同模板的条件渲染.我希望大多数用户获得普通welcome.html.erb模板,但有些用户可以获得特殊welcome_photographer.html.erb模板.这种类型的东西在ActionController中工作:

# (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
Run Code Online (Sandbox Code Playgroud)

但渲染不起作用 - 每个人都获得标准,welcome.html.erb即使@user.is_photographer == true

Sea*_*ill 54

打电话后,你不应该尝试做任何事情mail().但是,要选择其他模板,您应该:template_name作为选项传递.例如:

template = @user.is_photographer ? "welcome_photographer" : "welcome"
mail(:to => "#{@user.name} <#{@user.email}>", 
     :subject => "Welcome to ...", 
     :template_name => template)
Run Code Online (Sandbox Code Playgroud)


Mal*_*lte 9

Sean Hill的解决方案对我不起作用(Rails 3.2+).template_name似乎被忽略了.对我有用的是这样的:

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


Rut*_*son 9

有趣的轨道3.2.14这对我不起作用:

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

但这样做:

mail(:to => "#{@user.name} <#{@user.email}>", 
 :subject => "Welcome to ...", 
:template_name => template)
Run Code Online (Sandbox Code Playgroud)