rails Rails' rescue_from

02 Oct 2013
rescue_from is a very useful method in Rails. It lets us to catch exceptions and pass them to a callback or a block. A typical usecase is to handle ActiveRecord::RecordNotFound errors like in this example:
FooController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, with: not_found

  private
  def notfound
    message = "Foo with ID #{params[:id]} not found."
    logger.error message
    redirect_to not_found_url, info: message
  end
end
In the example above whenever an ActiveRecord::RecordNotFound raised in the scope of the FooController it will be caught and the notfound method will log the event than redirect to the notfound page with a message to display in the browser. Since rescue_from works with a block too we can refactor the above as follows:
FooController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound do |exception|
    message = "Foo with ID #{params[:id]} not found."
    logger.error message
    redirect_to not_found_url, info: message
  end
end
Another case when rescue_from comes handy is when we use cancan for authorization and we want to handle the authorization errors. We can do so by add the following to the application controller:
rescue_from CanCan::AccessDenied do |exception|
  redirect_to root_url, :alert => exception.message
end
As you see in this case we display the exception message set by cancan. If you want to use rescue_from from in a class which does not inherit from ActionController::Base you just need to mixin the ActiveSupport::Rescuable:
class Foo
  include ActiveSupport::Rescuable
end

I run an indie startup providing vulnerability scanning for your Ruby on Rails app. It is free to use at the moment, and I am grateful for any feedback about it.
If you would like to give it a spin, you can do it here: Vulnerability Scanning for your Ruby on Rails app!

Did you enjoy reading this? Follow me on Twitter or sign up to my newsletter for more content like this!

Related posts