提交 700c5835 编写于 作者: C Carlos Antonio da Silva

Improve and cleanup a bit partial renderer

* Remove template assignment: there is no need for this assignment,
  given we are rendering a collection with possibly different templates,
  and a second call to render (with the same instance) would behave
  differently if the template is set.
* Remove segments array in favor of Array#map
* Use local vars whenever possible
* Cache local template keys, remove defaults from find_template
上级 99e2a223
......@@ -14,12 +14,10 @@ def render
protected
def extract_details(options)
details = {}
@lookup_context.registered_details.each do |key|
@lookup_context.registered_details.each_with_object({}) do |key, details|
next unless value = options[key]
details[key] = Array(value)
end
details
end
def instrument(name, options={})
......
......@@ -283,7 +283,7 @@ def render_collection
return nil if @collection.blank?
if @options.key?(:spacer_template)
spacer = find_template(@options[:spacer_template]).render(@view, @locals)
spacer = find_template(@options[:spacer_template], @locals.keys).render(@view, @locals)
end
result = @template ? collection_with_template : collection_without_template
......@@ -291,11 +291,11 @@ def render_collection
end
def render_partial
locals, view, block = @locals, @view, @block
view, locals, block = @view, @locals, @block
object, as = @object, @variable
if !block && (layout = @options[:layout])
layout = find_template(layout, @locals.keys + [@variable])
layout = find_template(layout, @template_keys)
end
object ||= locals[as]
......@@ -337,6 +337,7 @@ def setup(context, options, block)
if @path
@variable, @variable_counter = retrieve_variable(@path)
@template_keys = retrieve_template_keys
else
paths.map! { |path| retrieve_variable(path).unshift(path) }
end
......@@ -358,62 +359,55 @@ def collection
end
def collection_from_object
if @object.respond_to?(:to_ary)
@object.to_ary
end
@object.to_ary if @object.respond_to?(:to_ary)
end
def find_partial
if path = @path
locals = @locals.keys
locals << @variable
locals << @variable_counter if @collection
find_template(path, locals)
find_template(path, @template_keys)
end
end
def find_template(path=@path, locals=@locals.keys)
def find_template(path, locals)
prefixes = path.include?(?/) ? [] : @lookup_context.prefixes
@lookup_context.find_template(path, prefixes, true, locals, @details)
end
def collection_with_template
segments, locals, template = [], @locals, @template
view, locals, template = @view, @locals, @template
as, counter = @variable, @variable_counter
if layout = @options[:layout]
layout = find_template(layout, @locals.keys + [@variable, @variable_counter])
layout = find_template(layout, @template_keys)
end
locals[counter] = -1
@collection.each do |object|
locals[counter] += 1
locals[as] = object
index = -1
@collection.map do |object|
locals[as] = object
locals[counter] = (index += 1)
content = template.render(@view, locals)
content = layout.render(@view, locals) { content } if layout
segments << content
content = template.render(view, locals)
content = layout.render(view, locals) { content } if layout
content
end
segments
end
def collection_without_template
segments, locals, collection_data = [], @locals, @collection_data
index, template, cache = -1, nil, {}
keys = @locals.keys
view, locals, collection_data = @view, @locals, @collection_data
cache = {}
keys = @locals.keys
@collection.each_with_index do |object, i|
path, *data = collection_data[i]
template = (cache[path] ||= find_template(path, keys + data))
locals[data[0]] = object
locals[data[1]] = (index += 1)
segments << template.render(@view, locals)
end
index = -1
@collection.map do |object|
index += 1
path, as, counter = collection_data[index]
@template = template
segments
locals[as] = object
locals[counter] = index
template = (cache[path] ||= find_template(path, keys + [as, counter]))
template.render(view, locals)
end
end
def partial_path(object = @object)
......@@ -453,6 +447,13 @@ def merge_prefix_into_object_path(prefix, object_path)
end
end
def retrieve_template_keys
keys = @locals.keys
keys << @variable
keys << @variable_counter if @collection
keys
end
def retrieve_variable(path)
variable = @options.fetch(:as) { path[%r'_?(\w+)(\.\w+)*$', 1] }.try(:to_sym)
variable_counter = :"#{variable}_counter" if @collection
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册