Rambling Labs Blog Ramblings on software development

  • Rails - Custom 404 and 500 pages and the exception_notification gem

    As I explained before on the Rails 3.1 - Adding custom 404 and 500 error pages post, sometimes you might want to have a custom way to handle your not found and internal server errors. In that case we wanted to show the error with a custom template.

    But, what if I have an important site from which I want to be notified if there is any error raised?
    There are a couple of gems for this. The one I'm most familiar with is exception_notification gem, which is easily configured as it is depicted on its README.

    This gem is added to the rails middleware stack and will capture any raised error and send you an email notifying about it.

    However, someone pointed out that when you set up both the custom error pages and the exception_notification, the email is never sent. This is because the exception is captured on the ApplicationController and it never gets to pass through the ExceptionNotifier middleware.

    Thankfully, the solution for this is very simple and is described on the README. So, just add this method to your application_controller.rb:

    class ApplicationController < ActionController::Base
      # ...
    
      private
    
      # ...
    
      def notify(exception)
        ExceptionNotifier::Notifier.exception_notification(request.env, exception,
          data: {message: 'an error happened'}).deliver
      end
    
      # ...
    end
    

    And call it from both render_404 and render_500 methods:

    class ApplicationController < ActionController::Base
      # ...
    
      private
    
      def render_404(exception)
        notify exception
        # ...
      end
    
      def render_500(exception)
        notify exception
        # ...
      end
      # ...
    end
    

    That should do it!

  • blog comments powered by Disqus