web-dev-qa-db-ja.com

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を取得します。

36
brittohalloran

mail()を呼び出した後は、何もしようとしないでください。ただし、別のテンプレートを選択するには、オプションとして:template_nameを渡す必要があります。例えば:

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

Sean Hillのソリューションは私には機能しません(Rails3.2以降)。 template_name無視されているようです。私のために働いたのは次のようなものです:

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

おかしいRails 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
Rutger Karlsson