mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Create MissingExactTemplate exception with separate template
This commit is contained in:
parent
b6ee4e4b98
commit
297a579de4
7 changed files with 37 additions and 20 deletions
|
@ -50,4 +50,7 @@ module ActionController
|
||||||
|
|
||||||
class UnknownFormat < ActionControllerError #:nodoc:
|
class UnknownFormat < ActionControllerError #:nodoc:
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class MissingExactTemplate < UnknownFormat #:nodoc:
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,18 +41,8 @@ module ActionController
|
||||||
|
|
||||||
raise ActionController::UnknownFormat, message
|
raise ActionController::UnknownFormat, message
|
||||||
elsif interactive_browser_request?
|
elsif interactive_browser_request?
|
||||||
message = "#{self.class.name}\##{action_name} is missing a template " \
|
message = "#{self.class.name}\##{action_name} is missing a template for request formats: #{request.formats.map(&:to_s).join(',')}"
|
||||||
"for this request format and variant.\n\n" \
|
raise ActionController::MissingExactTemplate, message
|
||||||
"request.formats: #{request.formats.map(&:to_s).inspect}\n" \
|
|
||||||
"request.variant: #{request.variant.inspect}\n\n" \
|
|
||||||
"NOTE! For XHR/Ajax or API requests, this action would normally " \
|
|
||||||
"respond with 204 No Content: an empty white screen. Since you're " \
|
|
||||||
"loading it in a web browser, we assume that you expected to " \
|
|
||||||
"actually render a template, not nothing, so we're showing an " \
|
|
||||||
"error to be extra-clear. If you expect 204 No Content, carry on. " \
|
|
||||||
"That's what you'll get from an XHR or API request. Give it a shot."
|
|
||||||
|
|
||||||
raise ActionController::UnknownFormat, message
|
|
||||||
else
|
else
|
||||||
logger.info "No template found for #{self.class.name}\##{action_name}, rendering head :no_content" if logger
|
logger.info "No template found for #{self.class.name}\##{action_name}, rendering head :no_content" if logger
|
||||||
super
|
super
|
||||||
|
|
|
@ -12,6 +12,7 @@ module ActionDispatch
|
||||||
"ActionController::UnknownHttpMethod" => :method_not_allowed,
|
"ActionController::UnknownHttpMethod" => :method_not_allowed,
|
||||||
"ActionController::NotImplemented" => :not_implemented,
|
"ActionController::NotImplemented" => :not_implemented,
|
||||||
"ActionController::UnknownFormat" => :not_acceptable,
|
"ActionController::UnknownFormat" => :not_acceptable,
|
||||||
|
"ActionController::MissingExactTemplate" => :not_acceptable,
|
||||||
"ActionController::InvalidAuthenticityToken" => :unprocessable_entity,
|
"ActionController::InvalidAuthenticityToken" => :unprocessable_entity,
|
||||||
"ActionController::InvalidCrossOriginRequest" => :unprocessable_entity,
|
"ActionController::InvalidCrossOriginRequest" => :unprocessable_entity,
|
||||||
"ActionDispatch::Http::Parameters::ParseError" => :bad_request,
|
"ActionDispatch::Http::Parameters::ParseError" => :bad_request,
|
||||||
|
@ -22,11 +23,12 @@ module ActionDispatch
|
||||||
)
|
)
|
||||||
|
|
||||||
cattr_accessor :rescue_templates, default: Hash.new("diagnostics").merge!(
|
cattr_accessor :rescue_templates, default: Hash.new("diagnostics").merge!(
|
||||||
"ActionView::MissingTemplate" => "missing_template",
|
"ActionView::MissingTemplate" => "missing_template",
|
||||||
"ActionController::RoutingError" => "routing_error",
|
"ActionController::RoutingError" => "routing_error",
|
||||||
"AbstractController::ActionNotFound" => "unknown_action",
|
"AbstractController::ActionNotFound" => "unknown_action",
|
||||||
"ActiveRecord::StatementInvalid" => "invalid_statement",
|
"ActiveRecord::StatementInvalid" => "invalid_statement",
|
||||||
"ActionView::Template::Error" => "template_error"
|
"ActionView::Template::Error" => "template_error",
|
||||||
|
"ActionController::MissingExactTemplate" => "missing_exact_template",
|
||||||
)
|
)
|
||||||
|
|
||||||
attr_reader :backtrace_cleaner, :exception, :line_number, :file
|
attr_reader :backtrace_cleaner, :exception, :line_number, :file
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
<header>
|
||||||
|
<h1>No template for interactive request</h1>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div id="container">
|
||||||
|
<h3><%= h @exception.message %></h3>
|
||||||
|
|
||||||
|
<p class="summary">
|
||||||
|
<strong>NOTE!</strong><br>
|
||||||
|
Unless told otherwise, Rails expects an action to render a template with the same name,<br>
|
||||||
|
contained in a folder named after its controller.
|
||||||
|
|
||||||
|
If this controller is an API responding with 204 (No Content), <br>
|
||||||
|
which does not require a template,
|
||||||
|
then this error will occur when trying to access it via browser,<br>
|
||||||
|
since we expect an HTML template
|
||||||
|
to be rendered for such requests. If that's the case, carry on.
|
||||||
|
</p>
|
||||||
|
</div>
|
|
@ -0,0 +1,3 @@
|
||||||
|
Missing exact template
|
||||||
|
|
||||||
|
<%= @exception.message %>
|
|
@ -658,13 +658,13 @@ class RespondToControllerTest < ActionController::TestCase
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_variant_without_implicit_rendering_from_browser
|
def test_variant_without_implicit_rendering_from_browser
|
||||||
assert_raises(ActionController::UnknownFormat) do
|
assert_raises(ActionController::MissingExactTemplate) do
|
||||||
get :variant_without_implicit_template_rendering, params: { v: :does_not_matter }
|
get :variant_without_implicit_template_rendering, params: { v: :does_not_matter }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_variant_variant_not_set_and_without_implicit_rendering_from_browser
|
def test_variant_variant_not_set_and_without_implicit_rendering_from_browser
|
||||||
assert_raises(ActionController::UnknownFormat) do
|
assert_raises(ActionController::MissingExactTemplate) do
|
||||||
get :variant_without_implicit_template_rendering
|
get :variant_without_implicit_template_rendering
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -650,7 +650,7 @@ class ImplicitRenderTest < ActionController::TestCase
|
||||||
tests ImplicitRenderTestController
|
tests ImplicitRenderTestController
|
||||||
|
|
||||||
def test_implicit_no_content_response_as_browser
|
def test_implicit_no_content_response_as_browser
|
||||||
assert_raises(ActionController::UnknownFormat) do
|
assert_raises(ActionController::MissingExactTemplate) do
|
||||||
get :empty_action
|
get :empty_action
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue