我遇到了一个奇怪的,我不能解释有关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
约定应用于partial
和layout
。如果我自己插入下划线,它会回落到我预期的行为上,而不是在版面名称的前面加上_
。
有谁知道这是为什么?
编辑好了,不知道我怎么错过了这个......但这里的东西在做这个提及文档。看起来好像它自2.3.8开始就已经存在了,也许它在2.3.5(我们正在运行的版本)中做了不同的处理?
3.4.3部分布局
的部分可以使用自己的布局文件,就像一个视图可以使用 布局。例如,您可以调用的部分是这样的:
<%=渲染“link_area”:布局=>“graybar”%>这将寻找一个 部分名为_link_area.html.erb和使用使它布局 _graybar.html.erb。请注意,部分的布局遵循相同的 前导 - 下划线命名为常规部分,并放置在 相同的文件夹中,其文件属于它们的局部文件夹(不在主文件夹 布局文件夹中)。
如果您通过:object或:locals传递参数给partials,那么这将需要更多的代码mods,因为这些参数不适用于模板。我希望他们没有改变行为...... – farhadf