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 local_request? method in your own controller. Custom rescue behavior is achieved by overriding the rescue_action_in_public and rescue_action_locally methods.

Methods
Classes and Modules
Module ActionController::Rescue::ClassMethods
Constants
LOCALHOST = [/^127\.0\.0\.\d{1,3}$/, /^::1$/, /^0:0:0:0:0:0:0:1(%.*)?$/].freeze
DEFAULT_RESCUE_RESPONSE = :internal_server_error
DEFAULT_RESCUE_RESPONSES = { 'ActionController::RoutingError' => :not_found, 'ActionController::UnknownAction' => :not_found, 'ActiveRecord::RecordNotFound' => :not_found, 'ActiveRecord::StaleObjectError' => :conflict, 'ActiveRecord::RecordInvalid' => :unprocessable_entity, 'ActiveRecord::RecordNotSaved' => :unprocessable_entity, 'ActionController::MethodNotAllowed' => :method_not_allowed, 'ActionController::NotImplemented' => :not_implemented, 'ActionController::InvalidAuthenticityToken' => :unprocessable_entity
DEFAULT_RESCUE_TEMPLATE = 'diagnostics'
DEFAULT_RESCUE_TEMPLATES = { 'ActionView::MissingTemplate' => 'missing_template', 'ActionController::RoutingError' => 'routing_error', 'ActionController::UnknownAction' => 'unknown_action', 'ActionView::TemplateError' => 'template_error'
RESCUES_TEMPLATE_PATH = ActionView::Template::EagerPath.new_and_loaded( File.join(File.dirname(__FILE__), "templates"))
Protected Instance methods
local_request?(

True if the request came from localhost, 127.0.0.1. Override this method if you wish to redefine the meaning of a local request to include remote IP addresses or other criteria.

     # File actionpack/lib/action_controller/rescue.rb, line 124
124:       def local_request? #:doc:
125:         LOCALHOST.any?{ |local_ip| request.remote_addr =~ local_ip && request.remote_ip =~ local_ip }
126:       end
log_error(exception)

Overwrite to implement custom logging of errors. By default logs as fatal.

    # File actionpack/lib/action_controller/rescue.rb, line 79
79:       def log_error(exception) #:doc:
80:         ActiveSupport::Deprecation.silence do
81:           if ActionView::TemplateError === exception
82:             logger.fatal(exception.to_s)
83:           else
84:             logger.fatal(
85:               "\n#{exception.class} (#{exception.message}):\n  " +
86:               clean_backtrace(exception).join("\n  ") + "\n\n"
87:             )
88:           end
89:         end
90:       end
render_optional_error_file(status_code)

Attempts to render a static error page based on the status_code thrown, or just return headers if no such file exists. At first, it will try to render a localized static page. For example, if a 500 error is being handled Rails and locale is :da, it will first attempt to render the file at public/500.da.html then attempt to render public/500.html. If none of them exist, the body of the response will be left empty.

     # File actionpack/lib/action_controller/rescue.rb, line 107
107:       def render_optional_error_file(status_code)
108:         status = interpret_status(status_code)
109:         locale_path = "#{Rails.public_path}/#{status[0,3]}.#{I18n.locale}.html" if I18n.locale
110:         path = "#{Rails.public_path}/#{status[0,3]}.html"
111: 
112:         if locale_path && File.exist?(locale_path)
113:           render :file => locale_path, :status => status, :content_type => Mime::HTML
114:         elsif File.exist?(path)
115:           render :file => path, :status => status, :content_type => Mime::HTML
116:         else
117:           head status
118:         end
119:       end
rescue_action(exception)

Exception handler called when the performance of an action raises an exception.

    # File actionpack/lib/action_controller/rescue.rb, line 72
72:       def rescue_action(exception)
73:         rescue_with_handler(exception) ||
74:           rescue_action_without_handler(exception)
75:       end
rescue_action_in_public(exception)

Overwrite to implement public exception handling (for requests answering false to local_request?). By default will call render_optional_error_file. Override this method to provide more user friendly error messages.

    # File actionpack/lib/action_controller/rescue.rb, line 96
96:       def rescue_action_in_public(exception) #:doc:
97:         render_optional_error_file response_code_for_rescue(exception)
98:       end
rescue_action_locally(exception)

Render detailed diagnostics for unhandled exceptions rescued from a controller action.

     # File actionpack/lib/action_controller/rescue.rb, line 130
130:       def rescue_action_locally(exception)
131:         @template.instance_variable_set("@exception", exception)
132:         @template.instance_variable_set("@rescues_path", RESCUES_TEMPLATE_PATH)
133:         @template.instance_variable_set("@contents",
134:           @template.render(:file => template_path_for_local_rescue(exception)))
135: 
136:         response.content_type = Mime::HTML
137:         render_for_file(rescues_path("layout"),
138:           response_code_for_rescue(exception))
139:       end
rescue_action_without_handler(exception)
     # File actionpack/lib/action_controller/rescue.rb, line 141
141:       def rescue_action_without_handler(exception)
142:         log_error(exception) if logger
143:         erase_results if performed?
144: 
145:         # Let the exception alter the response if it wants.
146:         # For example, MethodNotAllowed sets the Allow header.
147:         if exception.respond_to?(:handle_response!)
148:           exception.handle_response!(response)
149:         end
150: 
151:         if consider_all_requests_local || local_request?
152:           rescue_action_locally(exception)
153:         else
154:           rescue_action_in_public(exception)
155:         end
156:       end