Skip to content
Browse files

Add source extract to detailed exception page

  • Loading branch information...
1 parent 90c8972 commit fe12e4650802d8f28136660fc9ce62c6a28f19e1 @guilleiguaran guilleiguaran committed
View
5 actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
@@ -42,7 +42,10 @@ def render_exception(env, exception)
:application_trace => wrapper.application_trace,
:framework_trace => wrapper.framework_trace,
:full_trace => wrapper.full_trace,
- :routes => formatted_routes(exception)
+ :routes => formatted_routes(exception),
+ :source_extract => wrapper.source_extract,
+ :line_number => wrapper.line_number,
+ :file => wrapper.file
)
file = "rescues/#{wrapper.rescue_template}"
View
22 actionpack/lib/action_dispatch/middleware/exception_wrapper.rb
@@ -25,7 +25,7 @@ class ExceptionWrapper
'ActionView::Template::Error' => 'template_error'
)
- attr_reader :env, :exception
+ attr_reader :env, :exception, :line_number, :file
def initialize(env, exception)
@env = env
@@ -56,6 +56,15 @@ def self.status_code_for_exception(class_name)
Rack::Utils.status_code(@@rescue_responses[class_name])
end
+ def source_extract
+ if trace = application_trace.first
+ file, line, _ = trace.split(":")
+ @file = file
+ @line_number = line.to_i
+ source_fragment(@file, @line_number)
+ end
+ end
+
private
def original_exception(exception)
@@ -81,5 +90,16 @@ def clean_backtrace(*args)
def backtrace_cleaner
@backtrace_cleaner ||= @env['action_dispatch.backtrace_cleaner']
end
+
+ def source_fragment(path, line)
+ full_path = Rails.root.join(path)
+ if File.exists?(full_path)
+ File.open(full_path, "r") do |file|
+ start = [line - 3, 0].max
+ lines = file.lines.drop(start).take(6)
+ Hash[*(start+1..(lines.count+start)).zip(lines).flatten]
+ end
+ end
+ end
end
end
View
8 actionpack/lib/action_dispatch/middleware/templates/rescues/_source.erb
@@ -0,0 +1,8 @@
+<% if @source_extract %>
+Extracted source (around line <strong>#<%= @line_number %></strong>):
+<pre>
+<% @source_extract.each do |line, source| %>
+<%= "#{(@line_number == line) ? "> " : " "}#{line}: #{source}" -%>
+<% end %>
+</pre>
+<% end %>
View
1 actionpack/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb
@@ -6,5 +6,6 @@
</h1>
<pre><%=h @exception.message %></pre>
+<%= render template: "rescues/_source" %>
<%= render template: "rescues/_trace" %>
<%= render template: "rescues/_request_and_response" %>

0 comments on commit fe12e46

Please sign in to comment.
Something went wrong with that request. Please try again.