aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/render/partials.rb
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2009-12-26 12:43:48 +0100
committerJosé Valim <jose.valim@gmail.com>2009-12-26 14:11:04 +0100
commit8a36e907d2a0a28be1fa8334221cc2e195d75168 (patch)
treebee2fcda31d70a340fe8dd28682c9502329cab20 /actionpack/lib/action_view/render/partials.rb
parentff1a1c0b4d08567e8aeaef698003b5cd96d79686 (diff)
downloadrails-8a36e907d2a0a28be1fa8334221cc2e195d75168.tar.gz
rails-8a36e907d2a0a28be1fa8334221cc2e195d75168.tar.bz2
rails-8a36e907d2a0a28be1fa8334221cc2e195d75168.zip
More <%= render(@posts) %> optimization.
Diffstat (limited to 'actionpack/lib/action_view/render/partials.rb')
-rw-r--r--actionpack/lib/action_view/render/partials.rb44
1 files changed, 20 insertions, 24 deletions
diff --git a/actionpack/lib/action_view/render/partials.rb b/actionpack/lib/action_view/render/partials.rb
index eb035ae2dd..5158415c20 100644
--- a/actionpack/lib/action_view/render/partials.rb
+++ b/actionpack/lib/action_view/render/partials.rb
@@ -191,23 +191,30 @@ module ActionView
def setup(options, block)
partial = options[:partial]
- @options = options
- @locals = options[:locals] || {}
- @block = block
+ @options = options
+ @locals = options[:locals] || {}
+ @block = block
if String === partial
- @object = options[:object]
- @path = partial
+ @object = options[:object]
+ @path = partial
+ @collection = collection
else
@object = partial
- @path = partial_path(partial)
+
+ if @collection = collection
+ paths = @collection_paths = @collection.map { |o| partial_path(o) }
+ @path = paths.uniq.size == 1 ? paths.first : nil
+ else
+ @path = partial_path
+ end
end
end
def render
options = @options
- if @collection = collection
+ if @collection
ActiveSupport::Notifications.instrument(:render_collection, :path => @path,
:count => @collection.size) do
render_collection
@@ -226,28 +233,17 @@ module ActionView
def render_collection
@template = template = find_template
-
return nil if @collection.blank?
if @options.key?(:spacer_template)
spacer = find_template(@options[:spacer_template]).render(@view, @locals)
end
- result = if template
- collection_with_template(template)
- else
- paths = @collection.map { |o| partial_path(o) }
-
- if paths.uniq.size == 1
- collection_with_template(find_template(paths.first))
- else
- collection_without_template(paths)
- end
- end
+ result = template ? collection_with_template : collection_without_template
result.join(spacer).html_safe!
end
- def collection_with_template(template)
+ def collection_with_template(template = @template)
segments, locals, as = [], @locals, @options[:as] || template.variable_name
counter_name = template.counter_name
@@ -264,14 +260,14 @@ module ActionView
segments
end
- def collection_without_template(collection_paths)
+ def collection_without_template(collection_paths = @collection_paths)
segments, locals, as = [], @locals, @options[:as]
index, template = -1, nil
@collection.each_with_index do |object, i|
template = find_template(collection_paths[i])
locals[template.counter_name] = (index += 1)
- locals[template.variable_name] = object
+ locals[as || template.variable_name] = object
segments << template.render(@view, locals)
end
@@ -319,9 +315,9 @@ module ActionView
def partial_path(object = @object)
@partial_names[object.class] ||= begin
- return nil unless object.respond_to?(:to_model)
+ object = object.to_model if object.respond_to?(:to_model)
- object.to_model.class.model_name.partial_path.dup.tap do |partial|
+ object.class.model_name.partial_path.dup.tap do |partial|
path = @view.controller_path
partial.insert(0, "#{File.dirname(path)}/") if path.include?(?/)
end