Rails ActionView::MissingTemplate问题:邮件模板无法识别咨询
问题原因与修复方案
核心问题:模板路径配置错误
你在mail方法里指定的template_path多写了views/前缀——Rails会自动在项目根目录的views文件夹下查找模板,无需手动添加该前缀,这才导致模板匹配失败。
修复步骤:
1. 修正邮件类中的模板路径
将template_path的值从'views/mailers/contact_us_mailer'改为'mailers/contact_us_mailer',修改后的邮件类代码:
class ContactUsMailer < ActionMailer::Base default from: 'myemail@gmail.com' def contact_us(name:, email:, message:) @name = name @email = email @message = message mail( to: 'myemail@gmail.com', subject: "New email inquiry from #{@name} (#{@email})", template_path: 'mailers/contact_us_mailer', # 移除views/前缀 template_name: 'contact_us' ) end end
2. 确保模板文件名合规
Rails模板必须携带格式后缀,你的HTML模板文件名应为contact_us.html.erb(不能只叫contact_us),放在views/mailers/contact_us_mailer/目录下。如果需要纯文本版本,可额外创建contact_us.text.erb。
3. 可选:简化配置(推荐)
其实可以完全省略template_path和template_name参数,只要保持以下对应关系即可:
- 将模板目录从
views/mailers/contact_us_mailer迁移到views/contact_us_mailer(ContactUsMailer的默认mailer_name就是contact_us_mailer) - 邮件类代码简化为:
class ContactUsMailer < ActionMailer::Base default from: 'myemail@gmail.com' def contact_us(name:, email:, message:) @name = name @email = email @message = message mail( to: 'myemail@gmail.com', subject: "New email inquiry from #{@name} (#{@email})" ) end end
此时Rails会自动匹配views/contact_us_mailer/contact_us.html.erb模板。
验证修复
移除body: @message参数,重新触发邮件发送,即可正常加载模板并发送完整的HTML邮件。
内容的提问来源于stack exchange,提问作者Misha Krul
相关产品推荐
相关产品推荐

