rendering a partial with an array as its :object

This code does not work the same way as it did in 2.x:

render :partial => "things", :object => ['foo', 'bar', 'baz']

In 2.x, the "things" partial would be rendered once with a local
variable called "things" storing the given array.

In 3.0.0 (and edge), the Action View assumes that you really
meant :collection => ['foo', 'bar', 'baz'], so it iterates through the
array and renders the partial once with each element. It will do this
for any object which responds to to_ary.

I really think this is a case of Rails being too clever for its own
good. The difference in behaviour between the :object and :collection
options is large enough that this makes for a big break in
expectations. If someone wants the :collection behaviour, they should
use :collection.

(FWIW, an easy workaround is to pass the array into :locals, which
people should probably be doing for arrays 99% of the time anyway, but
silently assuming they meant :collection is not the way to encourage
that behaviour.)

The relevant change to the code is more than a year old now (commit
d0301e1) but I couldn't find any discussion about the change and the
tests don't seem to assert anything about it either way. If it's
really the behaviour we want, then it should be tested and documented.
I can make a patch in either case.


This is interesting. I don't think Rails should acts that way. It should only iterate through the collection only if :collection => is provided.

Can you open the lighthouse ticket for this one?



Made a ticket:


Just wanted to point out that I made a patch for this, attached to the
ticket, so any codereviews/feedback/+1's would be great:


Had the same problem! Thanks for reporting!

I suffered this. I was very annoyed because Rails was rendering nothing. Then I
realized I was passing an empty array and I remembered this issue!


Can you create a ticket and assign to me. I'll have a look on it.

Thank you :slight_smile: