Basically, there are two methods (
rescue_action
and rescue_action_in_public
) that you would need to override based on your needs. By default, these two methods do the best job to handle exception both in development and production mode. rescue_action
method will be called with an exception parameter that raises inside an action method. rescue_action_in_public method
, however, is used for public exception handling (for requests answering false to local_request?
). local_request?
method tells which rescue_*** method to call.http://api.rubyonrails.org/classes/ActionController/Rescue.html
More importantly, we can handle exceptions for specific controller instead of the whole. All you need to do is to override one of these methods inside that controller.
class PostsController < ApplicationController
def rescue_action_in_public(exception)
case(exception)
when ActiveRecord::RecordNotFound then render :file => '/bad_record'
when NoMethodError then render :file => '/no_method'
else render :file => '/error'
end
end
end
We can even handle them in a much cleaner way rather than if/else statement by using rescue_from. What it does is that it maps an exception type to handler method. This handler method can take either an exception parameter or a non-argument. We can even specify a proc or block.
class PostsController < ApplicationController
# Declare exception to handler methods
rescue_from ActiveRecord::RecordNotFound, :with => :bad_record
rescue_from NoMethodError, :with => :show_error
def bad_record; render :file => '/bad_record'; end
def show_error(exception); render :text => exception.message; end
end
http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-exception-handling
1 comment:
Generally I do not post on blogs, but I would love to mention that this post extremely forced me to try and do therefore! really nice post. thanks, here's a similar subject you'll like [url=http://corina33.blogs-blogs.com/71255/The+advantages+of+owning+a+Natural+Light+Alarm+Timepiece.html]Collectables[/url]
Post a Comment