Module | ActionController::Rescue |
In: |
vendor/rails/actionpack/lib/action_controller/rescue.rb
|
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.
LOCALHOST | = | '127.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 | = | { 'ActionController::MissingTemplate' => 'missing_template', 'ActionController::RoutingError' => 'routing_error', 'ActionController::UnknownAction' => 'unknown_action', 'ActionView::TemplateError' => 'template_error' |
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 vendor/rails/actionpack/lib/action_controller/rescue.rb, line 167 167: def local_request? #:doc: 168: request.remote_addr == LOCALHOST and request.remote_ip == LOCALHOST 169: end
Overwrite to implement custom logging of errors. By default logs as fatal.
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 130 130: def log_error(exception) #:doc: 131: ActiveSupport::Deprecation.silence do 132: if ActionView::TemplateError === exception 133: logger.fatal(exception.to_s) 134: else 135: logger.fatal( 136: "\n\n#{exception.class} (#{exception.message}):\n " + 137: clean_backtrace(exception).join("\n ") + 138: "\n\n" 139: ) 140: end 141: end 142: end
Attempts to render a static error page based on the status_code thrown, or just return headers if no such file exists. For example, if a 500 error is being handled Rails will first attempt to render the file at public/500.html. If the file doesn‘t exist, the body of the response will be left empty.
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 154 154: def render_optional_error_file(status_code) 155: status = interpret_status(status_code) 156: path = "#{RAILS_ROOT}/public/#{status[0,3]}.html" 157: if File.exist?(path) 158: render :file => path, :status => status 159: else 160: head status 161: end 162: end
Exception handler called when the performance of an action raises an exception.
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 112 112: def rescue_action(exception) 113: log_error(exception) if logger 114: erase_results if performed? 115: 116: # Let the exception alter the response if it wants. 117: # For example, MethodNotAllowed sets the Allow header. 118: if exception.respond_to?(:handle_response!) 119: exception.handle_response!(response) 120: end 121: 122: if consider_all_requests_local || local_request? 123: rescue_action_locally(exception) 124: else 125: rescue_action_in_public(exception) 126: end 127: end
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.s
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 146 146: def rescue_action_in_public(exception) #:doc: 147: render_optional_error_file response_code_for_rescue(exception) 148: end
Render detailed diagnostics for unhandled exceptions rescued from a controller action.
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 173 173: def rescue_action_locally(exception) 174: add_variables_to_assigns 175: @template.instance_variable_set("@exception", exception) 176: @template.instance_variable_set("@rescues_path", File.dirname(rescues_path("stub"))) 177: @template.send!(:assign_variables_from_controller) 178: 179: @template.instance_variable_set("@contents", @template.render_file(template_path_for_local_rescue(exception), false)) 180: 181: response.content_type = Mime::HTML 182: render_for_file(rescues_path("layout"), response_code_for_rescue(exception)) 183: end
Tries to rescue the exception by looking up and calling a registered handler.
# File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 186 186: def rescue_action_with_handler(exception) 187: if handler = handler_for_rescue(exception) 188: if handler.arity != 0 189: handler.call(exception) 190: else 191: handler.call 192: end 193: true # don't rely on the return value of the handler 194: end 195: end