-
-
Save gonzedge/1563416 to your computer and use it in GitHub Desktop.
class ApplicationController < ActionController::Base | |
# ... | |
unless Rails.application.config.consider_all_requests_local | |
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 | |
private | |
def render_error(status, exception) | |
respond_to do |format| | |
format.html { render template: "errors/error_#{status}", layout: 'layouts/application', status: status } | |
format.all { render nothing: true, status: status } | |
end | |
end | |
# ... | |
end |
%h2 404 | |
%div | |
%h3 We're sorry | |
%p | |
The content that you requested could not be found. | |
%p | |
You tried to access '#{@not_found_path}', which is not a valid page. | |
%p | |
Want to | |
%a{href: root_path} go back to our home page | |
and try again? |
class ErrorsController < ApplicationController | |
def error_404 | |
@not_found_path = params[:not_found] | |
end | |
def error_500 | |
end | |
end |
rails generate controller errors error_404 error_500 |
get "errors/error_404" | |
get "errors/error_500" |
unless Rails.application.config.consider_all_requests_local | |
match '*not_found', to: 'errors#error_404' | |
end |
How do you make sure the exception is logged in the log/RAILS_ENV.log file?
@RudthMael, I think that adding the something like this at the top of the render_404
and render_500
should do it:
def render_404(exception)
logger.info "Not Found: '#{request.fullpath}'.\n#{exception.class} error was raised for path .\n#{exception.message}"
# ...
end
def render_500(exception)
logger.info "System Error: Tried to access '#{request.fullpath}'.\n#{exception.class} error was raised for path .\n#{exception.message}"
# ...
end
Hope this helps
Yup. Thanks.
good. thanks
This is hard way. for flexible exception handling read this: http://blog.plataformatec.com.br/2012/01/my-five-favorite-hidden-features-in-rails-3-2/
This is missing in the controller:
class ErrorsController < ApplicationController
def error_404
render status: 404
end
def error_500
render status: 500
end
end
Otherwise you'll return 200's. An alternative is to make #render_error
protected and call it with the appropriate status.
This is indeed a lot of boilerplate just to use haml for my 404 page.
If there a good reason why you don't create a route for the errors controller actions? (useful for testing) and then redirect_to these routes from the app controller?
Thanks @karellm for the correction!