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.erb
或 notify_email.text.erb
文件中访问它,而不是使用 mail
的 body
参数。
因此在您的邮件文件中:
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.erb
或 notify_email.text.erb
:
<p><%= @body_content %></p>
编辑:
你没有提到你的用例,但当 rails 使这变得容易时,你仍然使事情复杂化。
如果您只想将实例变量用于 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 %>
如果您只想发送文本电子邮件,不想发送 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
我最近设置了几个邮件程序,我正在尝试对所有邮件程序进行布局。
这是通过创建一个包含以下内容的 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.erb
或 notify_email.text.erb
文件中访问它,而不是使用 mail
的 body
参数。
因此在您的邮件文件中:
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.erb
或 notify_email.text.erb
:
<p><%= @body_content %></p>
编辑: 你没有提到你的用例,但当 rails 使这变得容易时,你仍然使事情复杂化。
如果您只想将实例变量用于
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 %>
如果您只想发送文本电子邮件,不想发送 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