A simple and safe way to dynamically render error pages for Rails apps.
Rambulance's exceptions app is simple, skinny and well-tested. It inherits from ActionController::Base
, so it works fine even if your ApplicationController
has an issue.
You have full control of which error page to show for a specific exception. It also json rendering (perfect for API apps). It even provides a way to create a custom exceptions app.
You don't have to configure things that every single person has to do and Rambulance does everything for you.
Add this line to your application's Gemfile:
gem 'rambulance'
And then execute:
$ rails g rambulance:install
Rambulance's generator can only generate erb
templates. If you want to use haml or slim templates, please see How to Convert Your .erb
to .slim
or html2haml.
Now you can start editing templates like app/views/errors/not_found.html.erb
. Edit, run rails server
and open localhost:3000/rambulance/not_found
!
Open config/initializers/rambulance.rb
and to configure the list of pairs of exception/corresponding http status.
For example, if you want to display:
- 422(unprocessable entity) for
ActiveRecord::RecordNotUnique
- 403(forbidden) for
CanCan::AccessDenied
- 404(not found) for
YourCustomException
Then do the following:
# config/initializers/rambulance.rb
config.rescue_responses = {
"ActiveRecord::RecordNotUnique" => :unprocessable_entity,
"CanCan::AccessDenied" => :forbidden,
"YourCustomException" => :not_found
}
Just open one of the error pages via Rambulance:
This is useful when you want to edit templates without changing Rails configuration.
Change config.consider_all_requests_local
to false in config/environments/development.rb
.
config.consider_all_requests_local = false
This simulates how your production app displays error pages so you can actually raise an exception in your app and see how it works. Don't forget to change consider_all_requests_local
back to true after you tried this strategy.
If you want to do some more things in a exceptions app, you can also write your own custom exceptions app:
$ rails g rambulance:exceptions_app
It will generate your own custom exceptions app. You can use whatever techniques you want to use in controllers like before_filter
and flash[:notice] = "message..."
since it's a grandchild of ActionController::Base
!
Heavily customizing the exceptions app is strongly discouraged as there would be no guard against bugs that occur in the exceptions app.
Rambulance ships with a test helper that allows you to test an error page generated by Rails. All you have to do is to include Rambulance::TestHelper
and you will be able to use the with_exceptions_app
DSDL:
Rspec:
include Rambulance::TestHelper
it "shows an error page" do
with_exceptions_app do
get '/does_not_exist'
end
assert_equal 404, response.status
end
Minitest:
include Rambulance::TestHelper
test "it shows an error page" do
with_exceptions_app do
get '/does_not_exist'
end
assert_equal 404, response.status
end
Note that testing error pages is not encouraged in Rails as it leads to overuse of the rescue_from
DSL in controllers.
- Ruby 2.3, 2,4, 2,5, 2.6, 2.7, 3.0, 3.1, and JRuby 9.3
- Rails 4.2, 5.0, 5.1, 5.2, 6.0, 6.1, 7.0 and edge
Rambulance doesn't work with Rails 3.1 and below since they don't provide a way to use a custom exceptions app.
- Fork it ( https://github.com/yuki24/rambulance/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
Copyright (c) 2014-2015 Yuki Nishijima. See LICENSE.txt for further details.