Визуализировать другой вид (шаблон) для ActionMailer

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


person brittohalloran    schedule 21.11.2011    source источник


Ответы (3)


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

template = @user.is_photographer ? "welcome_photographer" : "welcome"
mail(:to => "#{@user.name} <#{@user.email}>", 
     :subject => "Welcome to ...", 
     :template_name => template)
person Sean Hill    schedule 21.11.2011
comment
Я знаю, что это старый ответ, но я нашел его сегодня. Должен ли :template_name => template вместо этого быть :template_name => "template"? Я попробовал это по-вашему и в итоге обратился к документам, которые показывают это как строку. - person Tass; 23.02.2016
comment
template — это переменная, которой присваивается строка в первой строке. В зависимости от того, является пользователь фотографом или нет, template может быть либо "welcome_photographer", либо "welcome". - person Sean Hill; 23.02.2016

Решение от Шона Хилла у меня не работает (Rails 3.2+). template_name похоже игнорируется. Что сработало для меня, так это:

mail(:to => "#{@user.name} <#{@user.email}>", :subject => "Welcome to ...") do |format|
  format.html { render 'templatename' }
end
person Malte    schedule 20.09.2013
comment
Этот метод также позволяет вам устанавливать абсолютные пути в каталогах представлений, которые, по-видимому, не разрешены template_name. - person Qwertie; 08.10.2018

Забавно в рельсах 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)
person Rutger Karlsson    schedule 07.11.2013
comment
Я обнаружил, что блок с do и format.html помогает при рендеринге из другого подкаталога, который не принадлежит почтовой программе. Спасибо - person mjnissim; 21.02.2014