在Ruby on Rails中,渲染'shared/score',:locals => {:score => @ foo.score}不会传递到本地?

nop*_*ole 5 ruby-on-rails ruby-on-rails-3

也许我错过了http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials中的内容

似乎要渲染部分,我们可以使用

render 'shared/score'
Run Code Online (Sandbox Code Playgroud)

但下一节将讨论当地人

render :partial => 'bar', :locals => { :score => @foo.score }
Run Code Online (Sandbox Code Playgroud)

但是第一种形式呢?

render 'shared/score', :locals => { :score => @foo.score }
Run Code Online (Sandbox Code Playgroud)

上面的一行不会传入当地人,为什么?

看起来似乎必须如此

render :partial => 'shared/score', :locals => { :score => @foo.score }
Run Code Online (Sandbox Code Playgroud)

但为什么呢?(我使用的是Rails 3.0.6)

Mik*_*wis 8

你真的想要:

render 'shared/score', { :score => @foo.score }
Run Code Online (Sandbox Code Playgroud)

说明

你可以看看它的源代码render.

http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render

如果您看到第一个参数不是哈希值,则默认为部分名称,并将第二个参数作为本地传递.

问题在于它需要第二个参数的本地人.:locals => {:score => @foo.score}起初可能看起来很正确,但你真的想要:{:score=> @foo.score}.

这样做的原因是它将方法的:locals选项设置为_render_partial第二个参数.所以如果你按照自己的方式去做,它实际上看起来像:

:locals => {:locals => {:score=>@foo.score}}
Run Code Online (Sandbox Code Playgroud)

哪个没有多大意义.