Rails ActionView::MissingTemplate,邮件程序缺少模板

问题描述 投票:0回答:1

我有一个名为 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"

任何有关如何进行的建议将不胜感激。

ruby-on-rails templates actionmailer mailer
1个回答
0
投票

template_path
选项始终与
views/mailers
文件夹相关,因此在您的情况下只是
template_path: "contact_us_mailer"
,但根据您的类名,这是不必要的,就像基于邮件程序方法名称的
template_name
一样。

© www.soinside.com 2019 - 2024. All rights reserved.