Refactor debug view

Avoid logic in ERB and use helpers
This commit is contained in:
Kir Shatrov 2014-12-01 17:45:33 -05:00
parent cd77755ae4
commit 083f657c0f
4 changed files with 54 additions and 23 deletions

@ -2,12 +2,40 @@
require 'action_dispatch/middleware/exception_wrapper' require 'action_dispatch/middleware/exception_wrapper'
require 'action_dispatch/routing/inspector' require 'action_dispatch/routing/inspector'
require 'pp'
module ActionDispatch module ActionDispatch
# This middleware is responsible for logging exceptions and # This middleware is responsible for logging exceptions and
# showing a debugging page in case the request is local. # showing a debugging page in case the request is local.
class DebugExceptions class DebugExceptions
RESCUES_TEMPLATE_PATH = File.expand_path('../templates', __FILE__) RESCUES_TEMPLATE_PATH = File.expand_path('../templates', __FILE__)
class DebugView < ActionView::Base
def debug_params(params)
clean_params = params.clone
clean_params.delete("action")
clean_params.delete("controller")
if clean_params.empty?
'None'
else
PP.pp(clean_params, "", 200)
end
end
def debug_headers(headers)
if headers.present?
headers.inspect.gsub(',', ",\n")
else
'None'
end
end
def debug_hash(object)
object.to_hash.sort_by { |k, _| k.to_s }.map { |k, v| "#{k}: #{v.inspect rescue $!.message}" }.join("\n")
end
end
def initialize(app, routes_app = nil) def initialize(app, routes_app = nil)
@app = app @app = app
@routes_app = routes_app @routes_app = routes_app
@ -46,7 +74,7 @@ def render_exception(env, exception)
source_to_show_id = source_to_show[:id] source_to_show_id = source_to_show[:id]
end end
template = ActionView::Base.new([RESCUES_TEMPLATE_PATH], template = DebugView.new([RESCUES_TEMPLATE_PATH],
request: request, request: request,
exception: wrapper.exception, exception: wrapper.exception,
traces: traces, traces: traces,

@ -1,6 +1,5 @@
require 'action_controller/metal/exceptions' require 'action_controller/metal/exceptions'
require 'active_support/core_ext/module/attribute_accessors' require 'active_support/core_ext/module/attribute_accessors'
require 'pp'
module ActionDispatch module ActionDispatch
class ExceptionWrapper class ExceptionWrapper

@ -5,27 +5,8 @@
<pre id="blame_trace" <%='style="display:none"' if hide %>><code><%= @exception.describe_blame %></code></pre> <pre id="blame_trace" <%='style="display:none"' if hide %>><code><%= @exception.describe_blame %></code></pre>
<% end %> <% end %>
<%
clean_params = @request.filtered_parameters.clone
clean_params.delete("action")
clean_params.delete("controller")
request_dump = if clean_params.empty?
'None'
else
pretty_params = ""
PP.pp(clean_params, pretty_params, 200)
pretty_params
end
def debug_hash(object)
object.to_hash.sort_by { |k, _| k.to_s }.map { |k, v| "#{k}: #{v.inspect rescue $!.message}" }.join("\n")
end unless self.class.method_defined?(:debug_hash)
%>
<h2 style="margin-top: 30px">Request</h2> <h2 style="margin-top: 30px">Request</h2>
<p><b>Parameters</b>:</p> <pre><%= request_dump %></pre> <p><b>Parameters</b>:</p> <pre><%= debug_params(@request.filtered_parameters) %></pre>
<div class="details"> <div class="details">
<div class="summary"><a href="#" onclick="return toggleSessionDump()">Toggle session dump</a></div> <div class="summary"><a href="#" onclick="return toggleSessionDump()">Toggle session dump</a></div>
@ -38,4 +19,4 @@
</div> </div>
<h2 style="margin-top: 30px">Response</h2> <h2 style="margin-top: 30px">Response</h2>
<p><b>Headers</b>:</p> <pre><%= defined?(@response) ? @response.headers.inspect.gsub(',', ",\n") : 'None' %></pre> <p><b>Headers</b>:</p> <pre><%= debug_headers(defined?(@response) ? @response.headers : {}) %></pre>

@ -241,6 +241,29 @@ def setup
assert_match(/RuntimeError\n\s+in FeaturedTileController/, body) assert_match(/RuntimeError\n\s+in FeaturedTileController/, body)
end end
test "show formatted params" do
@app = DevelopmentApp
params = {
'id' => 'unknown',
'someparam' => {
'foo' => 'bar',
'abc' => 'goo'
}
}
get("/runtime_error", {}, {
'action_dispatch.show_exceptions' => true,
'action_dispatch.request.parameters' => {
'action' => 'show',
'controller' => 'featured_tile'
}.merge(params)
})
assert_response 500
assert_includes(body, CGI.escapeHTML(PP.pp(params, "", 200)))
end
test "sets the HTTP charset parameter" do test "sets the HTTP charset parameter" do
@app = DevelopmentApp @app = DevelopmentApp