【发布时间】:2011-11-11 11:30:35
【问题描述】:
关于 Rails 3 和使用布局渲染部分(来自控制器),我遇到了一个我无法完全解释的奇怪现象。我希望有人可以提供一些关于正在发生的事情的见解。
首先,我们将此控制器称为“旧版”控制器。它已经存在了很长时间并且做错了很多事情,但我现在不打算重构它,所以我正在尝试找到使用我们现有的方法。
new 操作是这样的(在BarsController 中)
def new
if something
render :partial => "foo", :layout => "bars"
elsif something_else
render :partial => "foo2", :layout => "bars"
elsif something_else_else
render :partial => "foo3", :layout => "bars"
else
render :partial => "foo4", :layout => "bars"
end
现在,在 Rails 2.3.5 中,它运行良好。它会在适当的布局内呈现适当的部分——我意识到布局选项在这里是多余的,因为无论如何它都会默认为条形布局。当我们升级到 Rails 3.0.x 时,我们开始收到如下错误:
Missing partial layouts/bars with {:handlers=>[:erb, :rjs, :builder, :rhtml, :rxml], :formats=>[:html]
显然layouts/bars.html.erb 文件一直存在,所以我无法弄清楚。我可以使用:layout => false 进行渲染,但这当然行不通。最终我发现,如果我执行以下任一操作,它就会起作用:
1) 将我的布局重命名为 _bars.html.erb 而不是 bars.html.erb 并且:
render :partial => 'foo2', :layout => 'bars'
2) 保持我的布局为bars.html.erb(我想要的)和:
render '_foo2' # :partial option is redundant here anyway
似乎使用 :partial 选项而不是字符串作为第一个参数会导致 Rails 将 _name.html.erb 约定应用于 partial 和 layout。如果我自己输入下划线,它会退回到我预期的行为,即不在布局名称前面添加_。
有人知道为什么会这样吗?
编辑好吧,不知道我是怎么错过的……但是文档中提到了这一点。似乎它从 2.3.8 开始就存在了,也许它在 2.3.5 中做了不同的事情(我们运行的是什么)?
3.4.3 部分布局
partial 可以使用自己的布局文件,就像视图可以使用 布局。例如,您可能会这样调用局部:
"graybar" %> 这会寻找一个 部分命名为 _link_area.html.erb 并使用布局渲染它 _graybar.html.erb。请注意,部分布局遵循相同的 前导下划线命名为常规部分,并放置在 与它们所属的部分文件夹相同的文件夹(不在主文件夹中 布局文件夹)。
【问题讨论】:
-
如果您通过 :object 或 :locals 将参数传递给部分,这将需要更多代码模块,因为它们不适用于模板。我希望他们没有改变行为......
标签: ruby-on-rails ruby-on-rails-3