1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Build only one PartialIteration object for loop

This commit is contained in:
Rafael Mendonça França 2014-07-16 14:28:39 -03:00
parent 9830ebbeaf
commit 9290fc5ce2
2 changed files with 26 additions and 16 deletions

View file

@ -4,9 +4,9 @@ module ActionView
class PartialIteration # :nodoc: class PartialIteration # :nodoc:
attr_reader :size, :index attr_reader :size, :index
def initialize(size, index) def initialize(size)
@size = size @size = size
@index = index @index = 0
end end
def first? def first?
@ -16,6 +16,10 @@ module ActionView
def last? def last?
index == size - 1 index == size - 1
end end
def iterate!
@index += 1
end
end end
# = Action View Partials # = Action View Partials
@ -412,16 +416,16 @@ module ActionView
layout = find_template(layout, @template_keys) layout = find_template(layout, @template_keys)
end end
index = -1 partial_interation = PartialIteration.new(@collection.size)
@collection.map do |object| locals[iteration] = partial_interation
index += 1
@collection.map do |object|
locals[as] = object locals[as] = object
locals[counter] = index locals[counter] = partial_interation.index
locals[iteration] = PartialIteration.new(@collection.size, index)
content = template.render(view, locals) content = template.render(view, locals)
content = layout.render(view, locals) { content } if layout content = layout.render(view, locals) { content } if layout
partial_interation.iterate!
content content
end end
end end
@ -431,17 +435,20 @@ module ActionView
cache = {} cache = {}
keys = @locals.keys keys = @locals.keys
index = -1 partial_interation = PartialIteration.new(@collection.size)
@collection.map do |object| @collection.map do |object|
index += 1 index = partial_interation.index
path, as, counter, iteration = collection_data[index] path, as, counter, iteration = collection_data[index]
locals[as] = object locals[as] = object
locals[counter] = index locals[counter] = index
locals[iteration] = PartialIteration.new(@collection.size, index) locals[iteration] = partial_interation
template = (cache[path] ||= find_template(path, keys + [as, counter])) template = (cache[path] ||= find_template(path, keys + [as, counter]))
template.render(view, locals) content = template.render(view, locals)
partial_interation.iterate!
content
end end
end end

View file

@ -3,28 +3,31 @@ require 'action_view/renderer/partial_renderer'
class PartialIterationTest < ActiveSupport::TestCase class PartialIterationTest < ActiveSupport::TestCase
def test_has_size_and_index 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 0, iteration.index, "should be at the first index"
assert_equal 3, iteration.size, "should have the size" assert_equal 3, iteration.size, "should have the size"
end end
def test_first_is_true_when_current_is_at_the_first_index 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" assert iteration.first?, "first when current is 0"
end end
def test_first_is_false_unless_current_is_at_the_first_index 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" assert !iteration.first?, "not first when current is 1"
end end
def test_last_is_true_when_current_is_at_the_last_index 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" assert iteration.last?, "last when current is 2"
end end
def test_last_is_false_unless_current_is_at_the_last_index 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" assert !iteration.last?, "not last when current is 0"
end end
end end