diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2014-07-16 14:28:39 -0300 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2014-07-16 14:54:22 -0300 |
commit | 9290fc5ce213836f666a97e0e458d98e69a920ac (patch) | |
tree | 613d7a4918cd94311aaae0cecf82d48c217c7c51 /actionview | |
parent | 9830ebbeaf6f7faead9b4503ed9c9ab0a327df9a (diff) | |
download | rails-9290fc5ce213836f666a97e0e458d98e69a920ac.tar.gz rails-9290fc5ce213836f666a97e0e458d98e69a920ac.tar.bz2 rails-9290fc5ce213836f666a97e0e458d98e69a920ac.zip |
Build only one PartialIteration object for loop
Diffstat (limited to 'actionview')
-rw-r--r-- | actionview/lib/action_view/renderer/partial_renderer.rb | 29 | ||||
-rw-r--r-- | actionview/test/template/partial_iteration_test.rb | 13 |
2 files changed, 26 insertions, 16 deletions
diff --git a/actionview/lib/action_view/renderer/partial_renderer.rb b/actionview/lib/action_view/renderer/partial_renderer.rb index 6b3c49aa79..bc0215b6c6 100644 --- a/actionview/lib/action_view/renderer/partial_renderer.rb +++ b/actionview/lib/action_view/renderer/partial_renderer.rb @@ -4,9 +4,9 @@ module ActionView class PartialIteration # :nodoc: attr_reader :size, :index - def initialize(size, index) + def initialize(size) @size = size - @index = index + @index = 0 end def first? @@ -16,6 +16,10 @@ module ActionView def last? index == size - 1 end + + def iterate! + @index += 1 + end end # = Action View Partials @@ -412,16 +416,16 @@ module ActionView layout = find_template(layout, @template_keys) end - index = -1 - @collection.map do |object| - index += 1 + partial_interation = PartialIteration.new(@collection.size) + locals[iteration] = partial_interation + @collection.map do |object| locals[as] = object - locals[counter] = index - locals[iteration] = PartialIteration.new(@collection.size, index) + locals[counter] = partial_interation.index content = template.render(view, locals) content = layout.render(view, locals) { content } if layout + partial_interation.iterate! content end end @@ -431,17 +435,20 @@ module ActionView cache = {} keys = @locals.keys - index = -1 + partial_interation = PartialIteration.new(@collection.size) + @collection.map do |object| - index += 1 + index = partial_interation.index path, as, counter, iteration = collection_data[index] locals[as] = object locals[counter] = index - locals[iteration] = PartialIteration.new(@collection.size, index) + locals[iteration] = partial_interation template = (cache[path] ||= find_template(path, keys + [as, counter])) - template.render(view, locals) + content = template.render(view, locals) + partial_interation.iterate! + content end end diff --git a/actionview/test/template/partial_iteration_test.rb b/actionview/test/template/partial_iteration_test.rb index af0dde96c3..695f9f1bef 100644 --- a/actionview/test/template/partial_iteration_test.rb +++ b/actionview/test/template/partial_iteration_test.rb @@ -3,28 +3,31 @@ require 'action_view/renderer/partial_renderer' class PartialIterationTest < ActiveSupport::TestCase def test_has_size_and_index - iteration = ActionView::PartialIteration.new 3, 0 + iteration = ActionView::PartialIteration.new 3 assert_equal 0, iteration.index, "should be at the first index" assert_equal 3, iteration.size, "should have the size" end def test_first_is_true_when_current_is_at_the_first_index - iteration = ActionView::PartialIteration.new 3, 0 + iteration = ActionView::PartialIteration.new 3 assert iteration.first?, "first when current is 0" end def test_first_is_false_unless_current_is_at_the_first_index - iteration = ActionView::PartialIteration.new 3, 1 + iteration = ActionView::PartialIteration.new 3 + iteration.iterate! assert !iteration.first?, "not first when current is 1" end def test_last_is_true_when_current_is_at_the_last_index - iteration = ActionView::PartialIteration.new 3, 2 + iteration = ActionView::PartialIteration.new 3 + iteration.iterate! + iteration.iterate! assert iteration.last?, "last when current is 2" end def test_last_is_false_unless_current_is_at_the_last_index - iteration = ActionView::PartialIteration.new 3, 0 + iteration = ActionView::PartialIteration.new 3 assert !iteration.last?, "not last when current is 0" end end |