Rails plugin to rescue common Rails exceptions, render an error with your look and feel, and return an appropriate HTTP status code
Ruby
Switch branches/tags
Nothing to show
Pull request Compare This branch is 1 commit ahead of technicalpickles:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
generators/safety_valve
lib
tasks
test
MIT-LICENSE
README
Rakefile
init.rb
safety_valve.gemspec

README

SafetyValve
===========

Because that pressure has to go somewhere.

http://www.youtube.com/watch?v=7jF5r_AK9q4&feature=related

Errors are bound to happen. When your users encounter one, by default, they will see a generic page provided by Rails. Wouldn't it be nice if you could give them an error page that fits the look and feel of your app?

That's where comes in: it provides you with some sane defaults for rescuing from some common Rails exceptions. It also returns a HTTP status code that is appropriate

For now, it only handles exceptions would be 404 (File Not Found) errors. This includes:

 * ActiveRecord::RecordNotFound
 * ActionController::RoutingError
 * ActionController::UnknownAction
 * ActionController::UnknownController

Example
=======

Update your app/controller/application.rb to look something like:

    class ApplicationController < ActionController::Base
      include SafetyValve::Controller
      # ... rest of your code here
    end
    
Generate the error templates:

    script/generate safety_valve errors
    
This creates a template at app/views/errors/404.html.erb. It can be whatever you want, but here's what it looks like by default:

    <div class="error">
      The resource you requested was not found.
    </div>
    

We can now do functional tests that make sure we get 404 errors when accessing resources that don't exist. Here's an example in shoulda:

    class EventsControllerTest < Test::Rails::ControllerTestCase
      context "trying to view an event that doesn't exist" do
        setup do
          get :show, :id => 'gibberish aieeeee'
        end

        should_respond_with :not_found # 404 works as well
      end
    end
    
The effect
==========

If you're controller does a Model.find(params[:id]), and the record doesn't exist, you'll see ActiveRecord::RecordNotFound. SafetyValve will handle rescuing this, and will see that app/views/errors/404.html.erb (or 404.html.haml) is rendered.

Gotchas
=======

A few of the exceptions will always bubble up to the top in development mode, so you won't see the effect:

 * ActionController::RoutingError

References
==========

This plugin was inspired by some of these fine posts:

 * http://coderkitty.sweetperceptions.com/2008/7/6/meaningful-404s-and-500s
 * http://henrik.nyh.se/2008/07/rails-404
 * http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-exception-handling

Copyright
=========

Copyright (c) 2008 Josh Nichols, released under the MIT license