Rails Action Mailer 未显示正文和布局

Rails Action Mailer not showing body with layout

我最近设置了几个邮件程序,我正在尝试对所有邮件程序进行布局。 这是通过创建一个包含以下内容的 ApplicationMailer.rb 来完成的:

class Application < ActionMailer::Base
    layout 'mailer'
end

我在 app/views/layouts 中有一个 mailer.html.erb 文件,在同一个地方有一个 mailer.text.erb 文件。

mailer.html.erb:

<!DOCTYPE HTML>
<HTML lang="en">
<head>
</head>
<body>
    <%= yield %>
    <hr>
    <footer>
        Message sent from "xxx"
    </footer>
</html>

这与我们的 PasswordMailer 配合使用效果很好:

class PasswordMailer < ApplicationMailer
    def password_changed(user)
        @user = user
        mail(:to => user.email, :subject => t('mailer.email_topic_password_changed'))
    end
end

但是这个布局不适用于我的其他邮件程序:

class SystemImportMailer < ApplicationMailer
  def notify_email(params)
    mail(to: params[:email],
         subject: "#{t('admin.import_export.import_file')}"
         body: params[:body])
  end
end

此邮件程序仅像往常一样显示正文,未在布局中包含消息。 如果我删除 body: params[:body]) 行,它会显示布局消息。我不确定为什么会这样。

谢谢

编辑: 我也有这个 Mailer 使用不同的添加正文的技术。

class ScheduleMailer < ApplicationMailer
  def send_start_email(params)
    mail(to: params[:to], subject: I18n.t('schedule.start_subject')) do |format|
      format.text do
        render :text => I18n.t('schedule.start_message', type: params[:type], key: params[:key], company: params[:company]
      end
    end
  end
end

是的,那行不通。当你说:

mail(to: params[:email],
         subject: "#{t('admin.import_export.import_file')}"
         body: params[:body])

body 参数将替换您所有的 mailer 布局模板,因此您的电子邮件内容将只有 params[:body] 内容。如果您不传递 body 参数(如 password_mailer),它将检查 app/views/password 邮件文件夹中的视图并将该视图呈现给电子邮件。

因此,您可以创建实例变量并在 notify_email.html.erbnotify_email.text.erb 文件中访问它,而不是使用 mailbody 参数。

因此在您的邮件文件中:

class SystemImportMailer < ApplicationMailer
  def notify_email(params)
    # create this variable
    @body_content = params[:body]
    mail(to: params[:email],
         subject: "#{t('admin.import_export.import_file')}")
  end
end

然后在你的 notify_email.html.erbnotify_email.text.erb:

<p><%= @body_content %></p>

编辑: 你没有提到你的用例,但当 rails 使这变得容易时,你仍然使事情复杂化。

  1. 如果您只想将实例变量用于 text 版本的邮件,那么您可以创建 @text_only_body = params[:body],然后将此 @text_only_body 包含在您的 send_start_email.text.erb.不要将其包含在您的 .html.erb 文件中 例如:

    # Mailer
    def send_start_email(params)
      @text_only_body = params[:body]
      mail(to: params[:to], subject: I18n.t('schedule.start_subject'))
    end
    
    # send_start_email.text.erb
    Hello, <%= text_only_body %>
    
  2. 如果您只想发送文本电子邮件,不想发送 HTML 电子邮件,请执行以下操作:

    def send_start_email(params)
      @text_only_body = params[:body]
      mail(to: params[:to], subject: I18n.t('schedule.start_subject')) do |format|
        format.text
      end
    end