除非指定了body,否则Action Mailer Missing Template错误

时间:2016-07-09 17:06:56

标签: ruby-on-rails ruby actionmailer

您好我的代码中出现了一个错误的模板错误,我正在制作一个联系表单尽管文件位于我认为合适的位置,其他一切与我遵循的动作邮件基础知识教程完全一样。我甚至重新编辑了邮件,它仍然无法正常工作。

contactmailer

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

视图/ contact_mailer / notify.text.erb     测试

配置/ 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)

1 个答案:

答案 0 :(得分:1)

您只有纯文本模板。怎么样.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'行即可。