除非指定正文,否则 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'
行即可。
你好,尽管文件位于我认为正确的位置,但我正在制作的联系表单代码中出现缺少模板错误,其他一切都与我遵循的操作邮件程序基础教程完全一样。我什至重新制作了邮件程序,但它仍然无法正常工作。
联系人邮件
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'
行即可。