我试图让exception_notification和rails一起工作。我看了一堆其他的问题,并通过ReadMe在exception_notification gem页面上大量阅读。然而,大多数其他教程和问题似乎都过时了一年左右,在主要版本切换到4.0之前。更奇怪的是,正确的电子邮件似乎是在开发模式下发送的,而不是在生产模式下,这是我真正想要的。
相关代码如下:
我安装了gem 'exception_notification'
,正如它在ReadMe中所说的。
然后……内部配置/环境/production.rb
Whatever::Application.configure do
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
:address => "smtp.gmail.com",
:port => 587,
:user_name => 'blah@blah.com',
:password => 'blahblah',
:authentication => 'plain',
:enable_starttls_auto => true
}
config.action_mailer.perform_deliveries = true
config.action_mailer.default_url_options = {
:host => 'www.blah.com'
}
ActionMailer::Base.default :from => 'BlahApp <reply@blah.com>'
Paperclip.options[:command_path] = "/usr/bin/"
config.middleware.use ExceptionNotification::Rack,
:email => {
:email_prefix => "[Error!] ",
:sender_address => %{<reply@blah.com>},
:exception_recipients => ['"Test Recipient" <tester@blah.com>', '"Test 2" <test2@gmail.com>'],
}
正如我所说,当我复制/粘贴到开发。它似乎可以正常工作并发送电子邮件(尽管我实际上并没有收到它们,Paperclip可以捕获它们并在浏览器中打开它们,它们有我想要的东西)。然后在生产中,什么也没有发生,当我检查日志文件时,它似乎甚至没有尝试发送电子邮件。没有收到错误,除了我故意抛出的错误。
我看到有一些问题与SMTP的东西,所以我也尝试直接把smtp_settings直接到ExceptionNotification的电子邮件配置哈希(同时仍然有相同的设置外面),但没有运气。
我觉得我错过了一些愚蠢的东西。它应该非常简单易用。任何想法吗?很多谢谢!
好的,所以问题显然是以前的开发者(我继承了这个项目)已经设置了一种不同类型的错误捕获,只是呈现不同的错误页面。该函数只在生产环境中运行,并且它阻塞了对exception_notification的调用,这就是为什么它在生产环境中没有做任何事情,但在开发环境中工作得很好。所以…最后我所做的就是……
在app中…这已经在controllers/application_controller中了。rb文件:
unless Rails.application.config.consider_all_requests_local
#Commenting this would show user a blank page but also show a detailed error message. Don't do this
#Unless absolutely necessary.
rescue_from Exception, with: lambda { |exception| render_error 500, exception }
rescue_from ActionController::RoutingError, ActionController::UnknownController, AbstractController::ActionNotFound, ActiveRecord::RecordNotFound, with: lambda { |exception| render_error 404, exception }
end
render_error函数有一些渲染错误页面。因此,我添加了一个步骤来触发对exception_notification的调用,如下所示…
def render_error(status, exception)
if (status != 404)
ExceptionNotifier::Notifier
.exception_notification(exception, options.merge(:env => env))
.deliver
end
respond_to do |format|
format.html { render template: "home/error_#{status}", layout: 'layouts/heropage', status: status }
format.all { render nothing: true, status: status }
end
end
请在您的生产中添加Gemfile gem 'exception_notification', '4.1.0.rc1'
。rb文件
config.consider_all_requests_local = false
config.action_mailer.raise_delivery_errors = true
config.action_mailer.perform_deliveries = true
config.action_mailer.delivery_method = :smtp
config.action_mailer.default_url_options{host:'http://yourUrl.herokuapp.com/'
}
config.action_mailer.smtp_settings = {
address: "smtp.gmail.com",
port: 587,
domain: 'gmail.com',
authentication: "plain",
enable_starttls_auto: true,
user_name: "youremail@gmail.com",
password: "Password"
}
config.middleware.use ExceptionNotification::Rack,
:email => {
:email_prefix => "[Notifer] ",
:sender_address => %{"Exception Notification" < sender@domain.com>},
:exception_recipients => %w{first@domian.com second@domain.com }
}