11

I render a partial like so:

<%= render :partial => 'widgets/some_partial, :locals => {:foo => 'bar'} %>

So inside of _some_partial.html.erb I render two more partials like so:

<% #foo.nil? #=> false %>
<%= render :partial => 'widgets/another_partial', :locals => {:foo => foo} %>
`<%= render :partial => 'widgets/another_partial_again', :locals => {:foo => foo} %>`

The foo local variable renders fine in some_partial.html.erb and even in another_partial_again.html.erb. However, the foo variable is inaccessible in another_partial.html.erb even though I explicitly passed it in the render call.

What is happening here?

Thanks for the help.

user94154
  • 16,176
  • 20
  • 77
  • 116

3 Answers3

41

I had the undefined local variable or method error come up for me too when I was rendering a partial with :locals defined.

However, I had a different issue causing my problem, so I thought I would share my solution in case it helps anyone else. (This page was the first result when I googled this error after all)

Basically just make sure you use :partial => 'path/to/partial' in your call to render.

I.e.

<%= render :partial => 'widgets/some_partial', :locals => {:foo => 'bar'} %>

NOT like I was doing:

<%= render 'widgets/some_partial', :locals => {:foo => 'bar'} %>

Easy for a rails/ruby newbie like me to miss.

asgeo1
  • 9,028
  • 6
  • 63
  • 85
  • 6
    +1 @asgeo1 Strange that you need `:partial` to make it work, but this does indeed work! – iwasrobbed Apr 11 '11 at 20:31
  • wow!!! Thanks ... I am just learning Ruby and I was totally confused regarding this error. I wish I could mod-up more points. – Nabheet Feb 12 '12 at 19:04
  • This solved my issue as well but I'm really curious why the `render partial: "partial_name", locals: { foo: "bar" }` method has to be used. I understand that we are *actually* rendering a partial. What I don't understand is how that differs from a view. – Olivier Lacan Jun 14 '13 at 04:41
  • still useful in 2015! – rdnewman Jan 31 '15 at 00:36
3

Solved. Turns out I was also rendering the same partial from the controller without sending the proper local variables. Thanks anyways!!!

user94154
  • 16,176
  • 20
  • 77
  • 116
0

Bumped into this very old question cause I faced the same issue. Turned out that with Rails 4+ if you are not using collections or layout the correct way is:

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render "account", account: @buyer %>

As documented here.

Carlo S
  • 953
  • 1
  • 9
  • 14