aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/base/rescue.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2009-05-04 08:35:35 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2009-05-04 08:35:35 -0700
commit8b6d2ef2f562c34ebc2ef547b0a18c31f5820569 (patch)
treeb1397a8374b465ea2f300e776de126bb88386bcc /actionpack/lib/action_controller/base/rescue.rb
parentd3ee8756c8b09b8524a9599926b02ededd27319c (diff)
parentbcc4537f2a0d37fc02d67e9564fa5c9c5555b3d5 (diff)
downloadrails-8b6d2ef2f562c34ebc2ef547b0a18c31f5820569.tar.gz
rails-8b6d2ef2f562c34ebc2ef547b0a18c31f5820569.tar.bz2
rails-8b6d2ef2f562c34ebc2ef547b0a18c31f5820569.zip
Merge branch 'master' of git@github.com:rails/rails
Diffstat (limited to 'actionpack/lib/action_controller/base/rescue.rb')
-rw-r--r--actionpack/lib/action_controller/base/rescue.rb50
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