提交 991e98f5 编写于 作者: K Kasper Timm Hansen

Merge pull request #20276 from davetron5000/revert-head-on-no-template

Allow default_render to take a block to customize behavior when there's no template
......@@ -3,12 +3,27 @@ module ImplicitRender
include BasicImplicitRender
# Renders the template corresponding to the controller action, if it exists.
# The action name, format, and variant are all taken into account.
# For example, the "new" action with an HTML format and variant "phone"
# would try to render the <tt>new.html+phone.erb</tt> template.
#
# If no template is found <tt>ActionController::BasicImplicitRender</tt>'s implementation is called, unless
# a block is passed. In that case, it will override the super implementation.
#
# default_render do
# head 404 # No template was found
# end
def default_render(*args)
if template_exists?(action_name.to_s, _prefixes, variants: request.variant)
render(*args)
else
logger.info "No template found for #{self.class.name}\##{action_name}, rendering head :no_content" if logger
super
if block_given?
yield(*args)
else
logger.info "No template found for #{self.class.name}\##{action_name}, rendering head :no_content" if logger
super
end
end
end
......
......@@ -793,3 +793,24 @@ def test_variant_negotiation_without_block
assert_equal "phone", @response.body
end
end
class RespondToWithBlockOnDefaultRenderController < ActionController::Base
def show
default_render do
render text: 'default_render yielded'
end
end
end
class RespondToWithBlockOnDefaultRenderControllerTest < ActionController::TestCase
def setup
super
@request.host = "www.example.com"
end
def test_default_render_uses_block_when_no_template_exists
get :show
assert_equal "default_render yielded", @response.body
assert_equal "text/html", @response.content_type
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册