Locals do not appear in partial unless collection is explici

Maybe I'm misunderstanding something but it appears as if
<%= render :partial => @items, @locals => { :this => 'that' } %>
does not give the local variable this but this one does:
<%= render :partial => 'items/item', :collection => @items, @locals => {
:this => 'that' } %>
Shouldn't they mean the same thing?
I'm running rails 2.0.2

Martin

Martin Lübcke wrote:

Maybe I'm misunderstanding something but it appears as if
<%= render :partial => @items, @locals => { :this => 'that' } %>

Don't you want :locals => { ...
?

Mark Bush wrote:

Martin Lübcke wrote:

Maybe I'm misunderstanding something but it appears as if
<%= render :partial => @items, @locals => { :this => 'that' } %>

Don't you want :locals => { ...
?

Yes, that is both what I want and what I mean. It should be :locals in
both lines, the @ was just a typo.

Martin

Maybe I'm misunderstanding something but it appears as if
<%= render :partial => @items, @locals => { :this => 'that' } %>
does not give the local variable this but this one does:
<%= render :partial => 'items/item', :collection => @items, @locals
=> {
:this => 'that' } %>

Is @locals just a typo? Should be :locals.

Fred

Maybe I'm misunderstanding something but it appears as if
<%= render :partial => @items, @locals => { :this => 'that' } %>
does not give the local variable this but this one does:
<%= render :partial => 'items/item', :collection => @items, @locals
=> {
:this => 'that' } %>

Is @locals just a typo? Should be :locals.

Oops, ignore me, being a bit slow today.

Fred

Martin Lübcke wrote:

<%= render :partial => @items, @locals => { :this => 'that' } %>

Yes, that is both what I want and what I mean. It should be :locals in
both lines, the @ was just a typo.

ok :slight_smile:

Looking at the code for render_partial (abbreviated):

def render_partial(partial_path, object_assigns = nil, local_assigns =
nil)
  case partial_path
  when String, Symbol, NilClass
    :
    local_assigns = local_assigns ? local_assigns.clone : {}
    :
    render("#{path}/_#{partial_name}", local_assigns)
    :
  when Array, ActiveRecord::Associations::AssociationCollection,
       ActiveRecord::Associations::HasManyThroughAssociation
    :
    render_partial_collection(path, collection, nil,
object_assigns.value)
    :

So, if you pass an array or an association collection (such as @items
above) as the value of the :partial key, then local_assigns is *not*
passed through. Unless I'm reading this all wrong.

I have not looked to see if this is expected behaviour or a bug...

Mark Bush wrote:

def render_partial(partial_path, object_assigns = nil, local_assigns =
nil)
    :
    render_partial_collection(path, collection, nil,
object_assigns.value)
    :

To complete the picture here, the definition of render goes:

def render(options = {}, old_local_assigns = {}, &block) #:nodoc:
  :
  elsif options.is_a?(Hash)
    :
    elsif options[:partial] && options[:collection]
      render_partial_collection(options[:partial], options[:collection],
                                options[:spacer_template],
options[:locals])
    elsif options[:partial]
      render_partial(options[:partial],
                     ActionView::Base::ObjectWrapper.new(options[:object]),
                     options[:locals])

So yes, things work differently for partials if a collection is
supplied. Note that options[:locals] is supplied to #render_partial but
the argument in my previous post shows why this is not passed through to
#render_partial_collection, but it is if options[:collection] is
defined.