Maybe I missed something in http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials
It seems that to render a partial, we can use
render 'shared/score'
but the next section talks about locals
render :partial => 'bar', :locals => { :score => @foo.score }
But what about the first form?
render 'shared/score', :locals => { :score => @foo.score }
The line above will not pass in the locals, why?
It seems like it has to be
render :partial => 'shared/score', :locals => { :score => @foo.score }
but why is that? (I am using Rails 3.0.6)
You actually want:
Explanation
You can look at this for their source code on
render.http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render
If you see that if the first parameter is NOT a hash, it will default to that being the name of the partial, and pass the second paramater as locals.
The catch is that it wants the locals of in the 2nd paramater.
:locals => {:score => @foo.score}may seem right at first, but you actually want:{:score=> @foo.score}.The reason for this is that it sets the
:localsoption for the_render_partialmethod to the second paramater. So if you were to do it your way, it would actually look like:Which doesn’t make much sense.