doc/api/classes/ActionController/Rescue.html

Summary

Maintainability
Test Coverage
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>Module: ActionController::Rescue</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
  <script type="text/javascript">
  // <![CDATA[

  function popupCode( url ) {
    window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
  }

  function toggleCode( id ) {
    if ( document.getElementById )
      elem = document.getElementById( id );
    else if ( document.all )
      elem = eval( "document.all." + id );
    else
      return false;

    elemStyle = elem.style;
    
    if ( elemStyle.display != "block" ) {
      elemStyle.display = "block"
    } else {
      elemStyle.display = "none"
    }

    return true;
  }
  
  // Make codeblocks hidden by default
  document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
  
  // ]]>
  </script>

</head>
<body>



    <div id="classHeader">
        <table class="header-table">
        <tr class="top-aligned-row">
          <td><strong>Module</strong></td>
          <td class="class-name-in-header">ActionController::Rescue</td>
        </tr>
        <tr class="top-aligned-row">
            <td><strong>In:</strong></td>
            <td>
                <a href="../../files/vendor/rails/actionpack/lib/action_controller/rescue_rb.html">
                vendor/rails/actionpack/lib/action_controller/rescue.rb
                </a>
        <br />
            </td>
        </tr>

        </table>
    </div>
  <!-- banner header -->

  <div id="bodyContent">



  <div id="contextContent">

    <div id="description">
      <p>
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. So too could the decision on whether something is a public or
a developer request.
</p>
<p>
You can tailor the rescuing behavior and appearance by overwriting the
following two stub methods.
</p>

    </div>


   </div>

    <div id="method-list">
      <h3 class="section-bar">Methods</h3>

      <div class="name-list">
      <a href="#M000089">local_request?</a>&nbsp;&nbsp;
      <a href="#M000087">log_error</a>&nbsp;&nbsp;
      <a href="#M000086">rescue_action</a>&nbsp;&nbsp;
      <a href="#M000088">rescue_action_in_public</a>&nbsp;&nbsp;
      <a href="#M000090">rescue_action_locally</a>&nbsp;&nbsp;
      </div>
    </div>

  </div>


    <!-- if includes -->

    <div id="section">





      


    <!-- if method_list -->
    <div id="methods">
      <h3 class="section-bar">Protected Instance methods</h3>

      <div id="method-M000089" class="method-detail">
        <a name="M000089"></a>

        <div class="method-heading">
          <a href="#M000089" class="method-signature">
          <span class="method-name">local_request?</span><span class="method-args">(</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Overwrite to expand the meaning of a local request in order to show local
rescues on other occurrences than the remote IP being 127.0.0.1. For
example, this could include the IP of the developer machine when debugging
remotely.
</p>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000089-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000089-source">
<pre>
    <span class="ruby-comment cmt"># File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 63</span>
63:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">local_request?</span> <span class="ruby-comment cmt">#:doc:</span>
64:         [<span class="ruby-identifier">request</span>.<span class="ruby-identifier">remote_addr</span>, <span class="ruby-identifier">request</span>.<span class="ruby-identifier">remote_ip</span>] <span class="ruby-operator">==</span> [<span class="ruby-value str">&quot;127.0.0.1&quot;</span>] <span class="ruby-operator">*</span> <span class="ruby-value">2</span>
65:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000087" class="method-detail">
        <a name="M000087"></a>

        <div class="method-heading">
          <a href="#M000087" class="method-signature">
          <span class="method-name">log_error</span><span class="method-args">(exception)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Overwrite to implement custom logging of errors. By default logs as fatal.
</p>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000087-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000087-source">
<pre>
    <span class="ruby-comment cmt"># File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 36</span>
36:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">log_error</span>(<span class="ruby-identifier">exception</span>) <span class="ruby-comment cmt">#:doc:</span>
37:         <span class="ruby-constant">ActiveSupport</span><span class="ruby-operator">::</span><span class="ruby-constant">Deprecation</span>.<span class="ruby-identifier">silence</span> <span class="ruby-keyword kw">do</span>
38:           <span class="ruby-keyword kw">if</span> <span class="ruby-constant">ActionView</span><span class="ruby-operator">::</span><span class="ruby-constant">TemplateError</span> <span class="ruby-operator">===</span> <span class="ruby-identifier">exception</span>
39:             <span class="ruby-identifier">logger</span>.<span class="ruby-identifier">fatal</span>(<span class="ruby-identifier">exception</span>.<span class="ruby-identifier">to_s</span>)
40:           <span class="ruby-keyword kw">else</span>
41:             <span class="ruby-identifier">logger</span>.<span class="ruby-identifier">fatal</span>(
42:               <span class="ruby-node">&quot;\n\n#{exception.class} (#{exception.message}):\n    &quot;</span> <span class="ruby-operator">+</span>
43:               <span class="ruby-identifier">clean_backtrace</span>(<span class="ruby-identifier">exception</span>).<span class="ruby-identifier">join</span>(<span class="ruby-value str">&quot;\n    &quot;</span>) <span class="ruby-operator">+</span>
44:               <span class="ruby-value str">&quot;\n\n&quot;</span>
45:             )
46:           <span class="ruby-keyword kw">end</span>
47:         <span class="ruby-keyword kw">end</span>
48:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000086" class="method-detail">
        <a name="M000086"></a>

        <div class="method-heading">
          <a href="#M000086" class="method-signature">
          <span class="method-name">rescue_action</span><span class="method-args">(exception)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Exception handler called when the performance of an action raises an
exception.
</p>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000086-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000086-source">
<pre>
    <span class="ruby-comment cmt"># File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 24</span>
24:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">rescue_action</span>(<span class="ruby-identifier">exception</span>)
25:         <span class="ruby-identifier">log_error</span>(<span class="ruby-identifier">exception</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">logger</span>
26:         <span class="ruby-identifier">erase_results</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">performed?</span>
27: 
28:         <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">consider_all_requests_local</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">local_request?</span>
29:           <span class="ruby-identifier">rescue_action_locally</span>(<span class="ruby-identifier">exception</span>)
30:         <span class="ruby-keyword kw">else</span>
31:           <span class="ruby-identifier">rescue_action_in_public</span>(<span class="ruby-identifier">exception</span>)
32:         <span class="ruby-keyword kw">end</span>
33:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000088" class="method-detail">
        <a name="M000088"></a>

        <div class="method-heading">
          <a href="#M000088" class="method-signature">
          <span class="method-name">rescue_action_in_public</span><span class="method-args">(exception)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Overwrite to implement public exception handling (for requests answering
false to <tt><a href="Rescue.html#M000089">local_request?</a></tt>).
</p>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000088-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000088-source">
<pre>
    <span class="ruby-comment cmt"># File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 51</span>
51:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">rescue_action_in_public</span>(<span class="ruby-identifier">exception</span>) <span class="ruby-comment cmt">#:doc:</span>
52:         <span class="ruby-keyword kw">case</span> <span class="ruby-identifier">exception</span>
53:           <span class="ruby-keyword kw">when</span> <span class="ruby-constant">RoutingError</span>, <span class="ruby-constant">UnknownAction</span>
54:             <span class="ruby-identifier">render_text</span>(<span class="ruby-constant">IO</span>.<span class="ruby-identifier">read</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-constant">RAILS_ROOT</span>, <span class="ruby-value str">'public'</span>, <span class="ruby-value str">'404.html'</span>)), <span class="ruby-value str">&quot;404 Not Found&quot;</span>)
55:           <span class="ruby-keyword kw">else</span>
56:             <span class="ruby-identifier">render_text</span>(<span class="ruby-constant">IO</span>.<span class="ruby-identifier">read</span>(<span class="ruby-constant">File</span>.<span class="ruby-identifier">join</span>(<span class="ruby-constant">RAILS_ROOT</span>, <span class="ruby-value str">'public'</span>, <span class="ruby-value str">'500.html'</span>)), <span class="ruby-value str">&quot;500 Internal Error&quot;</span>)
57:         <span class="ruby-keyword kw">end</span>
58:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000090" class="method-detail">
        <a name="M000090"></a>

        <div class="method-heading">
          <a href="#M000090" class="method-signature">
          <span class="method-name">rescue_action_locally</span><span class="method-args">(exception)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p>
Renders a detailed diagnostics screen on action exceptions.
</p>
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000090-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000090-source">
<pre>
    <span class="ruby-comment cmt"># File vendor/rails/actionpack/lib/action_controller/rescue.rb, line 68</span>
68:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">rescue_action_locally</span>(<span class="ruby-identifier">exception</span>)
69:         <span class="ruby-identifier">add_variables_to_assigns</span>
70:         <span class="ruby-ivar">@template</span>.<span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-value str">&quot;@exception&quot;</span>, <span class="ruby-identifier">exception</span>)
71:         <span class="ruby-ivar">@template</span>.<span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-value str">&quot;@rescues_path&quot;</span>, <span class="ruby-constant">File</span>.<span class="ruby-identifier">dirname</span>(<span class="ruby-identifier">rescues_path</span>(<span class="ruby-value str">&quot;stub&quot;</span>)))    
72:         <span class="ruby-ivar">@template</span>.<span class="ruby-identifier">send</span>(<span class="ruby-identifier">:assign_variables_from_controller</span>)
73: 
74:         <span class="ruby-ivar">@template</span>.<span class="ruby-identifier">instance_variable_set</span>(<span class="ruby-value str">&quot;@contents&quot;</span>, <span class="ruby-ivar">@template</span>.<span class="ruby-identifier">render_file</span>(<span class="ruby-identifier">template_path_for_local_rescue</span>(<span class="ruby-identifier">exception</span>), <span class="ruby-keyword kw">false</span>))
75:     
76:         <span class="ruby-identifier">response</span>.<span class="ruby-identifier">content_type</span> = <span class="ruby-constant">Mime</span><span class="ruby-operator">::</span><span class="ruby-constant">HTML</span>
77:         <span class="ruby-identifier">render_file</span>(<span class="ruby-identifier">rescues_path</span>(<span class="ruby-value str">&quot;layout&quot;</span>), <span class="ruby-identifier">response_code_for_rescue</span>(<span class="ruby-identifier">exception</span>))
78:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>


    </div>


  </div>


<div id="validator-badges">
  <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
</div>

</body>
</html>