提交 e89ef3ce 编写于 作者: R Rafael Mendonça França

Merge pull request #16224 from egilburg/renderer_refactors

Some ActionView renderer refactors
...@@ -29,8 +29,9 @@ def render ...@@ -29,8 +29,9 @@ def render
def extract_details(options) def extract_details(options)
@lookup_context.registered_details.each_with_object({}) do |key, details| @lookup_context.registered_details.each_with_object({}) do |key, details|
next unless value = options[key] value = options[key]
details[key] = Array(value)
details[key] = Array(value) if value
end end
end end
...@@ -41,6 +42,7 @@ def instrument(name, options={}) ...@@ -41,6 +42,7 @@ def instrument(name, options={})
def prepend_formats(formats) def prepend_formats(formats)
formats = Array(formats) formats = Array(formats)
return if formats.empty? || @lookup_context.html_fallback_for_js return if formats.empty? || @lookup_context.html_fallback_for_js
@lookup_context.formats = formats | @lookup_context.formats @lookup_context.formats = formats | @lookup_context.formats
end end
end end
......
...@@ -312,6 +312,8 @@ def render(context, options, block) ...@@ -312,6 +312,8 @@ def render(context, options, block)
end end
end end
private
def render_collection def render_collection
return nil if @collection.blank? return nil if @collection.blank?
...@@ -353,25 +355,27 @@ def render_partial ...@@ -353,25 +355,27 @@ def render_partial
# respond to +to_partial_path+ in order to setup the path. # respond to +to_partial_path+ in order to setup the path.
def setup(context, options, block) def setup(context, options, block)
@view = context @view = context
partial = options[:partial]
@options = options @options = options
@locals = options[:locals] || {}
@block = block @block = block
@locals = options[:locals] || {}
@details = extract_details(options) @details = extract_details(options)
prepend_formats(options[:formats]) prepend_formats(options[:formats])
partial = options[:partial]
if String === partial if String === partial
@object = options[:object] @object = options[:object]
@collection = collection_from_options
@path = partial @path = partial
@collection = collection
else else
@object = partial @object = partial
@collection = collection_from_object || collection_from_options
if @collection = collection_from_object || collection if @collection
paths = @collection_data = @collection.map { |o| partial_path(o) } paths = @collection_data = @collection.map { |o| partial_path(o) }
@path = paths.uniq.size == 1 ? paths.first : nil @path = paths.uniq.one? ? paths.first : nil
else else
@path = partial_path @path = partial_path
end end
...@@ -392,7 +396,7 @@ def setup(context, options, block) ...@@ -392,7 +396,7 @@ def setup(context, options, block)
self self
end end
def collection def collection_from_options
if @options.key?(:collection) if @options.key?(:collection)
collection = @options[:collection] collection = @options[:collection]
collection.respond_to?(:to_ary) ? collection.to_ary : [] collection.respond_to?(:to_ary) ? collection.to_ary : []
...@@ -404,9 +408,7 @@ def collection_from_object ...@@ -404,9 +408,7 @@ def collection_from_object
end end
def find_partial def find_partial
if path = @path find_template(@path, @template_keys) if @path
find_template(path, @template_keys)
end
end end
def find_template(path, locals) def find_template(path, locals)
......
...@@ -6,19 +6,18 @@ def render(context, options) ...@@ -6,19 +6,18 @@ def render(context, options)
@view = context @view = context
@details = extract_details(options) @details = extract_details(options)
template = determine_template(options) template = determine_template(options)
context = @lookup_context
prepend_formats(template.formats) prepend_formats(template.formats)
unless context.rendered_format @lookup_context.rendered_format ||= (template.formats.first || formats.first)
context.rendered_format = template.formats.first || formats.first
end
render_template(template, options[:layout], options[:locals]) render_template(template, options[:layout], options[:locals])
end end
private
# Determine the template to be rendered using the given options. # Determine the template to be rendered using the given options.
def determine_template(options) #:nodoc: def determine_template(options)
keys = options.fetch(:locals, {}).keys keys = options.fetch(:locals, {}).keys
if options.key?(:body) if options.key?(:body)
......
...@@ -324,6 +324,10 @@ def test_render_partial_using_collection ...@@ -324,6 +324,10 @@ def test_render_partial_using_collection
@controller_view.render(customers, :greeting => "Hello") @controller_view.render(customers, :greeting => "Hello")
end end
def test_render_partial_using_collection_without_path
assert_equal "hi good customer: david0", @controller_view.render([ GoodCustomer.new("david") ], greeting: "hi")
end
def test_render_partial_without_object_or_collection_does_not_generate_partial_name_local_variable def test_render_partial_without_object_or_collection_does_not_generate_partial_name_local_variable
exception = assert_raises ActionView::Template::Error do exception = assert_raises ActionView::Template::Error do
@controller_view.render("partial_name_local_variable") @controller_view.render("partial_name_local_variable")
...@@ -388,6 +392,14 @@ def test_render_inline_with_locals_and_compilable_custom_type ...@@ -388,6 +392,14 @@ def test_render_inline_with_locals_and_compilable_custom_type
ActionView::Template.unregister_template_handler :foo ActionView::Template.unregister_template_handler :foo
end end
def test_render_body
assert_equal 'some body', @view.render(body: 'some body')
end
def test_render_plain
assert_equal 'some plaintext', @view.render(plain: 'some plaintext')
end
def test_render_knows_about_types_registered_when_extensions_are_checked_earlier_in_initialization def test_render_knows_about_types_registered_when_extensions_are_checked_earlier_in_initialization
ActionView::Template::Handlers.extensions ActionView::Template::Handlers.extensions
ActionView::Template.register_template_handler :foo, CustomHandler ActionView::Template.register_template_handler :foo, CustomHandler
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册