There are many solutions for creating customized error handling pages, but almost none for Rails 4:
The standard answer of encouraging people to modify 404.html
in /public
doesn't work for me because I want to use the CSS theme that resides in the asset pipeline. Is there a way that html files can access those styles defined in the asset pipeline? If not, is there a way to create a custom error handler that has access to the pipeline?
We've made a gem which does this for you:
exception_handler
.There is also a great tutorial here.
I also wrote an extensive answer on the subject here.
Middleware
Controller
View
This is very simple version - I can explain more if you wish.
Basically, you need to hook into the
config.exceptions_app
middleware, it will capture any exception in themiddleware
stack (as opposed to rendering the entire environment), allowing you to send the request to your owncontroller#action
.If you comment, I'll help you out some more if you want!
For Rails 4.1 I like this answer, add an asset type better; however I have not tried it. On Rails 4.0.8, these three references helped me:
Dynamic error pages is the second reference in the question. This worked just fine for me.
Custom error pages may have cribbed from the first reference, or the other way around, but goes the extra mile by adding some information about testing with Capybara.
I did not do the Capybara testing because I didn't want to change the test configuration; however, RSpec-Rails Request Specs clued me in to test these requests independently and see that they complete and return the correct content.
What follows is a nutshell description of what is taught by the three references:
Add the following setting to
config/environments/production.rb
Edit the routing configuration,
config/routes.rb
to direct the error pages to an errors controllerwill route the 404, 422, 500, and 503 page requests to the
show
action of theerrors
controller with a parametercode
that has the value of the status code.Create the controller,
app/controllers/errors_controller.rb
. Here is the entire content:My preference was to set a status message on
flash.alert
Create the pages themselves. I use
.erb
Here isapp/views/errors/500.html.erb
So you see that you can render a partial. The page renders with all of the layout boilerplate from
app/views/layouts/application.html.erb
or any other layout boilerplate that you have configured. That includes the<div id='alert'><%= alert %></div>
that displays the status message from the flash.Tested with RSpec by adding a test file,
spec/requests/errors_request_spec.rb
. Here is abbreviated content of that file that shows a test of the 500 status page:The first assertion checks for the flash alert. The second assertion checks for the partial.