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:
parent
9830ebbeaf
commit
9290fc5ce2
2 changed files with 26 additions and 16 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue