除非指定正文,否则 Action Mailer Missing Template 错误

Action Mailer Missing Template error unless body is specified

你好,尽管文件位于我认为正确的位置,但我正在制作的联系表单代码中出现缺少模板错误,其他一切都与我遵循的操作邮件程序基础教程完全一样。我什至重新制作了邮件程序,但它仍然无法正常工作。

联系人邮件

class ContactMailer < ApplicationMailer

default from: 'test@example.com'

layout 'mailer'

def notify(contact)
    @contact = contact
    mail(to: 'text@example.com', subject: 'Notification')
end
end

联系控制器

def create

  @contact = Contact.new(contact_params)  

  if @contact.save 

    ContactMailer.notify(@contact).deliver_now
    redirect_to root_path

  else
    render :new

  end


end

views/contact_mailer/notify.text.erb 测试

config/development.rb

Rails.application.configure do
# Settings specified here will take precedence over those in      config/application.rb.

# In the development environment your application's code is reloaded on
# every request. This slows down response time but is perfect for development
# since you don't have to restart the web server when you make code changes.
config.cache_classes = false

# Do not eager load code on boot.
config.eager_load = false

# Show full error reports and disable caching.
config.consider_all_requests_local       = true
config.action_controller.perform_caching = false

# Don't care if the mailer can't send.
config.action_mailer.raise_delivery_errors = true

# Print deprecation notices to the Rails logger.
config.active_support.deprecation = :log

# Raise an error on page load if there are pending migrations.
config.active_record.migration_error = :page_load

# Debug mode disables concatenation and preprocessing of assets.
# This option may cause significant delays in view rendering with a large
# number of complex assets.
config.assets.debug = true

# Asset digests allow you to set far-future HTTP expiration dates on all    assets,
# yet still be able to expire them through the digest params.
config.assets.digest = true

# Adds additional error checking when serving assets at runtime.
# Checks for improperly declared sprockets dependencies.
# Raises helpful error messages.
config.assets.raise_runtime_errors = true

config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
# SMTP settings for gmail
config.action_mailer.smtp_settings = {
:address              => "smtp.gmail.com",
:port                 => 587,
:domain               => "gmail.com",
:enable_starttls_auto => true,
:user_name            => 'example@gmail.com',
:password             => 'examplepassword',
:authentication       => "plain",
:ssl =>    false
:openssl_verify_mode  => 'none'
}
end

如果我向邮件添加正文参数,它可以工作,但在其他情况下不起作用。

编辑:我收到错误

ContactMailer#notify: processed outbound mail in 31.9ms
Completed 500 Internal Server Error in 61ms (ActiveRecord: 3.7ms)

ActionView::MissingTemplate (Missing template layouts/mailer with {:locale=>[:en], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :coffee, :jbuilder]}. Searched in:
  * "/home/ubuntu/workspace/autosales2/app/views"
):
  app/mailers/contact_mailer.rb:7:in `notify'
  app/controllers/contacts_controller.rb:15:in `create'


  Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/_source.erb (11.1ms)
  Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (5.2ms)
  Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.3ms)
  Rendered /usr/local/rvm/gems/ruby-2.2.2/gems/actionpack-4.2.5.1/lib/action_dispatch/middleware/templates/rescues/missing_template.html.erb within rescues/layout (93.5ms)

您只有纯文本模板。 .html.erb 呢?

尝试使用此代码将您的邮件程序限制为仅发送纯文本电子邮件,如果这是您想要的:

def notify(contact)
    @contact = contact
    mail(to: 'text@example.com', subject: 'Notification') do |format|
        format.text
    end
end

否则,如果您需要 html 电子邮件,请同时提供其模板。

更新

从错误文本可以看出,无法找到邮件程序的布局模板。你的邮件里有这个:

layout 'mailer'

这意味着任何特定的操作模板都将作为上述布局模板的一部分呈现。因此,您需要准备好这个布局模板。您可以看到邮件程序期望它被称为 layouts/mailer 并在 app/views 中查找它,这使得它成为

app/views/layouts/mailer.html.erb # for html emails
app/views/layouts/mailer.text.erb # for plain text emails

如果您不需要电子邮件的通用布局,只需删除 layout 'mailer' 行即可。