From e524327e510996ad741ba44c5403fe7353519e40 Mon Sep 17 00:00:00 2001 From: Matthew Eagar 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 `_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