diff options
author | Emilio Tagua <miloops@gmail.com> | 2009-05-04 19:23:34 -0300 |
---|---|---|
committer | Emilio Tagua <miloops@gmail.com> | 2009-05-04 19:23:34 -0300 |
commit | d3042ef80c4406c90ff1e120059a99784d8ae79f (patch) | |
tree | a779b4fced3fd546d7c7c855fee41f3d996afba0 /actionpack/lib/action_controller/base/rescue.rb | |
parent | d522b7ccf61a71b4c66ddf39368513d1fd9cd577 (diff) | |
parent | eb201e64c0b68aee6d0715d44cf48178204c4133 (diff) | |
download | rails-d3042ef80c4406c90ff1e120059a99784d8ae79f.tar.gz rails-d3042ef80c4406c90ff1e120059a99784d8ae79f.tar.bz2 rails-d3042ef80c4406c90ff1e120059a99784d8ae79f.zip |
Merge commit 'rails/master'
Diffstat (limited to 'actionpack/lib/action_controller/base/rescue.rb')
-rw-r--r-- | actionpack/lib/action_controller/base/rescue.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/actionpack/lib/action_controller/base/rescue.rb b/actionpack/lib/action_controller/base/rescue.rb new file mode 100644 index 0000000000..2717a06a37 --- /dev/null +++ b/actionpack/lib/action_controller/base/rescue.rb @@ -0,0 +1,50 @@ +module ActionController #:nodoc: + # Actions that fail to perform as expected throw exceptions. These + # exceptions can either be rescued for the public view (with a nice + # user-friendly explanation) or for the developers view (with tons of + # debugging information). The developers view is already implemented by + # the Action Controller, but the public view should be tailored to your + # specific application. + # + # The default behavior for public exceptions is to render a static html + # file with the name of the error code thrown. If no such file exists, an + # empty response is sent with the correct status code. + # + # You can override what constitutes a local request by overriding the + # <tt>local_request?</tt> method in your own controller. Custom rescue + # behavior is achieved by overriding the <tt>rescue_action_in_public</tt> + # and <tt>rescue_action_locally</tt> methods. + module Rescue + def self.included(base) #:nodoc: + base.send :include, ActiveSupport::Rescuable + base.extend(ClassMethods) + + base.class_eval do + alias_method_chain :perform_action, :rescue + end + end + + module ClassMethods + def rescue_action(env) + exception = env.delete('action_dispatch.rescue.exception') + request = ActionDispatch::Request.new(env) + response = ActionDispatch::Response.new + new.process(request, response, :rescue_action, exception).to_a + end + end + + protected + # Exception handler called when the performance of an action raises + # an exception. + def rescue_action(exception) + rescue_with_handler(exception) || raise(exception) + end + + private + def perform_action_with_rescue + perform_action_without_rescue + rescue Exception => exception + rescue_action(exception) + end + end +end |