2011-09-06 54 views
9

我遇到了一个奇怪的,我不能解释有关Rails 3和渲染局部布局(从控制器)。我希望有人能够对发生的事情提供一点见解。Rails 3 vs 2.3.5渲染怪异与部分和:布局

首先,我们将这个控制器称为“传统”控制器。它已经存在了很长一段时间,并且做了很多错误的事情,但我现在不想重构它,所以我试图找到方法来处理我们所拥有的。

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约定应用于partiallayout。如果我自己插入下划线,它会回落到我预期的行为上,而不是在版面名称的前面加上_

有谁知道这是为什么?


编辑好了,不知道我怎么错过了这个......但这里的东西在做这个提及文档。看起来好像它自2.3.8开始就已经存在了,也许它在2.3.5(我们正在运行的版本)中做了不同的处理?

3.4.3部分布局

的部分可以使用自己的布局文件,就像一个视图可以使用 布局。例如,您可以调用的部分是这样的:

<%=渲染“link_area”:布局=>“graybar”%>这将寻找一个 部分名为_link_area.html.erb和使用使它布局 _graybar.html.erb。请注意,部分的布局遵循相同的 前导 - 下划线命名为常规部分,并放置在 相同的文件夹中,其文件属于它们的局部文件夹(不在主文件夹 布局文件夹中)。


+0

如果您通过:object或:locals传递参数给partials,那么这将需要更多的代码mods,因为这些参数不适用于模板。我希望他们没有改变行为...... – farhadf

回答

15

下面是我自己的答案基于什么的问题我上面编辑:

由于Rails的2.3.8,它会出现,就像渲染部分与render :partial => 'foo', :layout => 'bars'时的默认行为期望“部分布局”文件以及部分视图文件。在这种情况下,会期望

app/views/_foo.html.erb以及app/views/layouts/_bars.html.erb

对于任何人遇到从Rails的2.3.5这个问题升级,这里是我发现有冲击最少的解决方案:

render '_foo', :layout => 'bars'

此解决方案不假定您正在渲染部分,因此不期望部分布局。另一种选择将是您的布局复制到

app/views/layouts/_bars.html.erb

,并使用

render :partial => 'foo', :layouts => 'bars'

,但导致一些代码重复。

钢轨2.3.8+ DOC关于这:

3.4.3部分布局

的部分可以使用其自己的布局文件,就如同一个视图可以使用 布局。例如,您可以调用的部分是这样的:

<%=渲染“link_area”:布局=>“graybar”%>这将寻找一个 部分名为_link_area.html.erb和使用使它布局 _graybar.html.erb。请注意,部分的布局遵循相同的 前导 - 下划线命名为常规部分,并放置在 相同的文件夹中,其文件属于它们的局部文件夹(不在主文件夹 布局文件夹中)。

+0

非常有用,谢谢分享! – Rubytastic