我有一个名为 ContactUsMailer 的邮件程序类,它继承自 ActionMailer::Base。
class ContactUsMailer < ActionMailer::Base
default from: '[email protected]'
def contact_us(name:, email:, message:)
@name = name
@email = email
@message = message
mail(
to: '[email protected]',
subject: "New email inquiry from #{@name} (#{@email})",
template_path: 'views/mailers/contact_us_mailer',
template_name: 'contact_us'
)
end
end
它是从 ContactUsController 调用的。
class ContactUsController < ApplicationController
def index
end
def create
if params[:name].blank? || params[:email].blank? || params[:message].blank?
flash[:error] = "Your name, email, and a message are required. Please try again."
else
ContactUsMailer.contact_us(
name: params[:name],
email: params[:email],
message: params[:message]
).deliver!
flash[:notice] = "Thank you for contacting us. We will get back to you shortly."
end
redirect_to contact_us_path
end
private
end
我的邮件模板存在于views/mailers/contact_us_mailer下。
<!DOCTYPE html>
<html>
<head>
<meta content='text/html; charset=UTF-8' http-equiv='Content-Type' />
</head>
<body>
<p>
New inquiry from <%= @name %>
</p>
<p>
Email: <%= @email %>
</p>
---------
Message: <%= @message %>
</body>
</html>
如果我不将
body:
添加到 mail()
中的 ContactUsMailer
调用中,我会收到以下错误:
Template is missing
Missing template views/mailers/contact_us_mailer/contact_us with "mailer". Searched in: * "views/mailers/contact_us_mailer"
如果我将
body: @message
添加到 mail()
调用中,我不会收到任何错误并且电子邮件发送成功,但是电子邮件仅包含消息而不包含模板本身。
我不明白为什么 Rails 无法识别模板,即使我指定了路径。深入研究
collect_responses_from_templates(headers)
方法,它可以清楚地识别标题中的模板数据。
def collect_responses_from_templates(headers)
=> 986: templates_path = headers[:template_path] || self.class.mailer_name
987: templates_name = headers[:template_name] || action_name
988:
989: each_template(Array(templates_path), templates_name).map do |template|
990: format = template.format || self.formats.first
(byebug) headers[:template_path]
"views/mailers/contact_us_mailer"
任何有关如何进行的建议将不胜感激。
template_path
选项始终与 views/mailers
文件夹相关,因此在您的情况下只是 template_path: "contact_us_mailer"
,但根据您的类名,这是不必要的,就像基于邮件程序方法名称的 template_name
一样。