Представление другого представления (шаблон) для ActionMailer - PullRequest
34 голосов
/ 22 ноября 2011

Я пытаюсь сделать условный рендеринг шаблона, отличного от 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

Но рендер не работает - все получают стандарт welcome.html.erb, даже если @user.is_photographer == true

Ответы [ 3 ]

53 голосов
/ 22 ноября 2011

Вы не должны пытаться что-либо делать после того, как позвоните mail(). Однако, чтобы выбрать другой шаблон, вы должны передать :template_name в качестве опции. Например:

template = @user.is_photographer ? "welcome_photographer" : "welcome"
mail(:to => "#{@user.name} <#{@user.email}>", 
     :subject => "Welcome to ...", 
     :template_name => template)
9 голосов
/ 07 ноября 2013

Смешно в рельсах 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)
9 голосов
/ 20 сентября 2013

Решение от Sean Hill не работает для меня (Rails 3.2+).template_name, кажется, игнорируется.То, что сработало для меня, выглядит примерно так:

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