From e524327e510996ad741ba44c5403fe7353519e40 Mon Sep 17 00:00:00 2001
From: Matthew Eagar <meagar@gmail.com>
Date: Tue, 24 Jan 2017 20:40:34 -0500
Subject: Add partial iteration variable to template keys

When rendering heterogeneous collection using `render @collection` or
`render partial: @collection`, the expected `<partial_name>_iteration`
variable is missing due to `find_template` not having the name of the
iteration variable included in its cache keys.
---
 actionview/lib/action_view/renderer/partial_renderer.rb | 2 +-
 actionview/test/fixtures/test/_partial_iteration_1.erb  | 1 +
 actionview/test/fixtures/test/_partial_iteration_2.erb  | 1 +
 actionview/test/template/render_test.rb                 | 9 +++++++++
 4 files changed, 12 insertions(+), 1 deletion(-)
 create mode 100644 actionview/test/fixtures/test/_partial_iteration_1.erb
 create mode 100644 actionview/test/fixtures/test/_partial_iteration_2.erb

diff --git a/actionview/lib/action_view/renderer/partial_renderer.rb b/actionview/lib/action_view/renderer/partial_renderer.rb
index 2bb4465131..647b15ea94 100644
--- a/actionview/lib/action_view/renderer/partial_renderer.rb
+++ b/actionview/lib/action_view/renderer/partial_renderer.rb
@@ -458,7 +458,7 @@ module ActionView
           locals[counter]   = index
           locals[iteration] = partial_iteration
 
-          template = (cache[path] ||= find_template(path, keys + [as, counter]))
+          template = (cache[path] ||= find_template(path, keys + [as, counter, iteration]))
           content = template.render(view, locals)
           partial_iteration.iterate!
           content
diff --git a/actionview/test/fixtures/test/_partial_iteration_1.erb b/actionview/test/fixtures/test/_partial_iteration_1.erb
new file mode 100644
index 0000000000..c0fdd4c22a
--- /dev/null
+++ b/actionview/test/fixtures/test/_partial_iteration_1.erb
@@ -0,0 +1 @@
+<%= defined?(partial_iteration_1_iteration) %>
diff --git a/actionview/test/fixtures/test/_partial_iteration_2.erb b/actionview/test/fixtures/test/_partial_iteration_2.erb
new file mode 100644
index 0000000000..50dd11db27
--- /dev/null
+++ b/actionview/test/fixtures/test/_partial_iteration_2.erb
@@ -0,0 +1 @@
+<%= defined?(partial_iteration_2_iteration) -%>
diff --git a/actionview/test/template/render_test.rb b/actionview/test/template/render_test.rb
index d189b2aa87..7f76916b72 100644
--- a/actionview/test/template/render_test.rb
+++ b/actionview/test/template/render_test.rb
@@ -301,6 +301,15 @@ module RenderTestCases
       @view.render(partial: "test/local_inspector", collection: [ Customer.new("mary") ])
   end
 
+  def test_render_partial_collection_with_different_partials_still_provides_partial_iteration
+    a = {}
+    b = {}
+    def a.to_partial_path; "test/partial_iteration_1"; end
+    def b.to_partial_path; "test/partial_iteration_2"; end
+
+    assert_equal "local-variable\nlocal-variable", @controller_view.render([a, b])
+  end
+
   def test_render_partial_with_empty_collection_should_return_nil
     assert_nil @view.render(partial: "test/customer", collection: [])
   end
-- 
cgit v1.2.3