Rails:对将locals传递给partials的语法感到困惑

Mel*_*emi 98 ruby-on-rails partial-views

理解Rails"魔术"关于渲染部分(并将局部传递到它们中).

为什么这样做:

<%= render "rabbits/form" %>
Run Code Online (Sandbox Code Playgroud)

这项工作:

<%= render "rabbits/form", :parent => @warren, :flash => flash %>
Run Code Online (Sandbox Code Playgroud)

但是这并不能正常工作:

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %>
Run Code Online (Sandbox Code Playgroud)

但这样做:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %>
Run Code Online (Sandbox Code Playgroud)

另外,我怎样才能查看这些细微差别所以我不需要在SO上打扰人们?

Dou*_*g R 152

简短的回答是render方法查看你传入的第一个参数.如果传入一个哈希(包括:partial => 'foo', :locals => {blah blah blah}),那么它会将所有参数作为哈希传递并相应地解析它们.

如果传入一个字符串作为第一个参数,它会假定第一个参数是您的部分名称,并将其余部分作为您的本地传递.然而,在随后的调用中,它实际上是指定的:locals => your_locals_argument,在这种情况下是整个:locals => {locals hash},而不仅仅是{locals hash}; 即你最终得到:locals => {:locals => {locals hash}},而不是:locals => {locals hash}.

所以我的建议是始终以相同的方式始终显式传递值,并且您不会遇到问题.为了了解这一点,我直接去了代码本身(actionpack/lib/base.rb,render()Rails 2中的方法; Rails 3不同).这是一个很好的锻炼.

此外,不要担心在SO上"打扰"人们.这就是这个网站存在的原因.我甚至从中学到了一些东西.


set*_*rgo 5

如果需要指定:locals,则需要指定:partial或:template

<%= render :partial => "rabbits/form", :locals => {...} %>
Run Code Online (Sandbox Code Playgroud)

应该管用