SimpleErrors - a simple way to rescue errors in Rails applications
On practically every job we rescue errors in the ApplicationController in the same way, so it was time for a gem. This gem rescues from defined error classes (along with the standard Rails ActiveRecordNotFound and RoutingError classes) to either a 404 or 500 error page.
If you need something more complicated than that (e.g. 403 errors), you still need to rescue in ApplicationController. They're not mutually exclusive, though.
Installation
Add this line to your application's Gemfile:
gem 'simple_errors'
And then execute:
$ bundle
Or install it yourself as:
$ gem install simple_errors
Configuration and setup
There's a generator to set up the files you need, and add a mixin in the application controller:
rails generate simple_errors
This will set up:
- /app/views/layouts/error.html.erb - a layout for errors.
- /app/views/errors/500.html.erb - the 500 error page
- /app/views/errors/404.html.erb - the 404 error page
It also removes the default error pages in /public.
Configuring ApplicationController
After you've run the generator, your Application Controller will look like this:
class ApplicationController < ActionController::Base
include SimpleErrors::Rescue
# other stuff
end
There are a couple of class methods provided by this gem to configure it.
Rescuing from other classes
If your application raises errors of other types, you might want to rescue to 404 instead of 500. Do that by adding a call to rescue_with_not_found
, passing one or many classes:
class ApplicationController < ActionController::Base
rescue_with_not_found Rooftop::RecordNotFoundError, Rooftop::Rails::AncestorMismatch
include SimpleErrors::Rescue
# other stuff
end
Doing something before rescuing
Sometime you want your error page to render something - for example, call the same method as a before_filter does to get navigation items.
class ApplicationController < ActionController::Base
rescue_with_not_found Rooftop::RecordNotFoundError, Rooftop::Rails::AncestorMismatch
include SimpleErrors::Rescue
before_rescue do
@foo = SomeMenu.find(1234)
end
end
The before_rescue
block is evaluated in the context of the rendering call, so if you set @foo in the example above it'll be available in your view.
Contributing
- Fork it ( https://github.com/errorstudio/simple_errors/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create a new Pull Request