Render Different View (шаблон) для 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
Ответы
Ответ 1
Вы не должны пытаться делать что-либо после вызова mail()
. Однако, чтобы выбрать другой шаблон, вы должны передать :template_name
в качестве опции. Например:
template = @user.is_photographer ? "welcome_photographer" : "welcome"
mail(:to => "#{@user.name} <#{@user.email}>",
:subject => "Welcome to ...",
:template_name => template)
Ответ 2
Решение от Sean Hill не работает для меня (Rails 3.2+). template_name
, похоже, игнорируется. Что сработало для меня, это примерно так:
mail(:to => "#{@user.name} <#{@user.email}>", :subject => "Welcome to ...") do |format|
format.html { render 'templatename' }
end
Ответ 3
Смешные в рельсах 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)