This came in handy for me, so I wanted to share this particular way of handling 404 and 500 errors.
First, rescue errors and tell what to do in application_controller.rb.
if Rails.env.production?
unless Rails.application.config.consider_all_requests_local
rescue_from Exception, with: :render_500
rescue_from ActionController::RoutingError, with: :render_404
rescue_from ActionController::UnknownController, with: :render_404
rescue_from ActionController::UnknownAction, with: :render_404
rescue_from ActiveRecord::RecordNotFound, with: :render_404
end
end
In the same application_controller.rb, then you create the methods specified above.
def render_404(exception)
@not_found_path = exception.message
respond_to do |format|
format.html { render template: 'errors/not_found', layout: 'layouts/application', status: 404 }
format.all { render nothing: true, status: 404 }
end
end
def render_500(exception)
logger.info exception.backtrace.join("\n")
respond_to do |format|
format.html { render template: 'errors/internal_server_error', layout: 'layouts/application', status: 500 }
format.all { render nothing: true, status: 500}
end
end
Since it’s using the application layout, you will see the error message you specify in the layout. The following is my 500 error page, /views/errors/internal_server_error.html.haml. For 404 page, you can also use @not_found_path instance variable in the view as well.
#errors-page
.thumbnail.errors
.errors-500
.caption
%h5 Sorry
%h1 500 Internal Server Error
- # Do not remove this line. It is used for development
- # purposes. When an error is found. In development, it
- # shows the logs, in production it is nil.
.error-msg
= @log
Cheers,