mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Use html for DidYouMean suggestions on error pages
The current suggestions are shown on a single line. Instead we can use some prettier formatting.
This commit is contained in:
parent
f6a94aff2e
commit
5cf725acb6
4 changed files with 46 additions and 8 deletions
|
@ -0,0 +1,18 @@
|
||||||
|
<% if exception.respond_to?(:original_message) && exception.respond_to?(:corrections) %>
|
||||||
|
<h2><%= h exception.original_message %></h2>
|
||||||
|
<%
|
||||||
|
# The 'did_you_mean' gem can raise exceptions when calling #corrections on
|
||||||
|
# the exception. If it does there are no corrections to show.
|
||||||
|
corrections = exception.corrections rescue []
|
||||||
|
%>
|
||||||
|
<% if corrections.any? %>
|
||||||
|
<b>Did you mean?</b>
|
||||||
|
<ul>
|
||||||
|
<% corrections.each do |correction| %>
|
||||||
|
<li style="list-style-type: none"><%= h correction %></li>
|
||||||
|
<% end %>
|
||||||
|
</ul>
|
||||||
|
<% end %>
|
||||||
|
<% else %>
|
||||||
|
<h2><%= h exception.message %></h2>
|
||||||
|
<% end %>
|
|
@ -8,11 +8,8 @@
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div id="container">
|
<div id="container">
|
||||||
<h2>
|
<%= render "rescues/message_and_suggestions", exception: @exception %>
|
||||||
<%= h @exception.message %>
|
<%= render "rescues/actions", exception: @exception, request: @request %>
|
||||||
|
|
||||||
<%= render "rescues/actions", exception: @exception, request: @request %>
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<%= render "rescues/source", source_extracts: @source_extracts, show_source_idx: @show_source_idx, error_index: 0 %>
|
<%= render "rescues/source", source_extracts: @source_extracts, show_source_idx: @show_source_idx, error_index: 0 %>
|
||||||
<%= render "rescues/trace", traces: @traces, trace_to_show: @trace_to_show, error_index: 0 %>
|
<%= render "rescues/trace", traces: @traces, trace_to_show: @trace_to_show, error_index: 0 %>
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
<h1>Unknown action</h1>
|
<h1>Unknown action</h1>
|
||||||
</header>
|
</header>
|
||||||
<div id="container">
|
<div id="container">
|
||||||
<h2><%= h @exception.message %></h2>
|
<%= render "rescues/message_and_suggestions", exception: @exception %>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -17,6 +17,12 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class SimpleController < ActionController::Base
|
||||||
|
def hello
|
||||||
|
self.response_body = "hello"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
class Boomer
|
class Boomer
|
||||||
attr_accessor :closed
|
attr_accessor :closed
|
||||||
|
|
||||||
|
@ -67,7 +73,8 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
|
||||||
when "/pass"
|
when "/pass"
|
||||||
[404, { "X-Cascade" => "pass" }, self]
|
[404, { "X-Cascade" => "pass" }, self]
|
||||||
when "/not_found"
|
when "/not_found"
|
||||||
raise AbstractController::ActionNotFound
|
controller = SimpleController.new
|
||||||
|
raise AbstractController::ActionNotFound.new(nil, controller, :not_found)
|
||||||
when "/runtime_error"
|
when "/runtime_error"
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
when "/method_not_allowed"
|
when "/method_not_allowed"
|
||||||
|
@ -101,7 +108,7 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
|
||||||
when "/missing_keys"
|
when "/missing_keys"
|
||||||
raise ActionController::UrlGenerationError, "No route matches"
|
raise ActionController::UrlGenerationError, "No route matches"
|
||||||
when "/parameter_missing"
|
when "/parameter_missing"
|
||||||
raise ActionController::ParameterMissing, :missing_param_key
|
raise ActionController::ParameterMissing.new(:missing_param_key, %w(valid_param_key))
|
||||||
when "/original_syntax_error"
|
when "/original_syntax_error"
|
||||||
eval "broke_syntax =" # `eval` need for raise native SyntaxError at runtime
|
eval "broke_syntax =" # `eval` need for raise native SyntaxError at runtime
|
||||||
when "/syntax_error_into_view"
|
when "/syntax_error_into_view"
|
||||||
|
@ -309,6 +316,22 @@ class DebugExceptionsTest < ActionDispatch::IntegrationTest
|
||||||
assert_match(/ActionController::ParameterMissing/, body)
|
assert_match(/ActionController::ParameterMissing/, body)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if defined?(DidYouMean) && DidYouMean.respond_to?(:correct_error)
|
||||||
|
test "rescue with suggestions" do
|
||||||
|
@app = DevelopmentApp
|
||||||
|
|
||||||
|
get "/not_found", headers: { "action_dispatch.show_exceptions" => true }
|
||||||
|
assert_response 404
|
||||||
|
assert_select("b", /Did you mean\?/)
|
||||||
|
assert_select("li", "hello")
|
||||||
|
|
||||||
|
get "/parameter_missing", headers: { "action_dispatch.show_exceptions" => true }
|
||||||
|
assert_response 400
|
||||||
|
assert_select("b", /Did you mean\?/)
|
||||||
|
assert_select("li", "valid_param_key")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
test "rescue with HTML format for HTML API request" do
|
test "rescue with HTML format for HTML API request" do
|
||||||
@app = ActionDispatch::DebugExceptions.new(Boomer.new(true), RoutesApp, :api)
|
@app = ActionDispatch::DebugExceptions.new(Boomer.new(true), RoutesApp, :api)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue