Rambulance provides 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 showing a specific error page for a specific exception. It can also render json responses. 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 only has support for erb
. If you would like 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
}
There are 2 ways of editing the templates.
Just go to 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'll generate your own custom exceptions app. You can use whatever techniques you use in controllers like before_filter
and flash[:notice] = "message..."
since it's a grandchild of ActionController::Base
!
Note that customizing the exceptions app is strongly discouraged as there would be no guard against bugs that occur in the exceptions app.
Ramnurance 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, trunk, JRuby 9.1.16.0, and JRuby head
- Rails 4.2, 5.0, 5,1, 5,2 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.