【问题标题】:Rails 3 vs 2.3.5 render oddities with :partial and :layoutRails 3 vs 2.3.5 使用 :partial 和 :layout 渲染奇怪的东西
【发布时间】: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 约定应用于 partiallayout。如果我自己输入下划线,它会退回到我预期的行为,即不在布局名称前面添加_

有人知道为什么会这样吗?


编辑好吧,不知道我是怎么错过的……但是文档中提到了这一点。似乎它从 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


【解决方案1】:

根据我上面编辑的内容,这是我自己对问题的回答:

从 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'

但这会导致一些代码重复。

RAILS 2.3.8+ 关于此的文档:

3.4.3 部分布局

partial 可以使用自己的布局文件,就像视图可以使用 布局。例如,您可能会这样调用局部:

"graybar" %> 这会寻找一个 部分命名为 _link_area.html.erb 并使用布局渲染它 _graybar.html.erb。请注意,部分布局遵循相同的 前导下划线命名为常规部分,并放置在 与它们所属的部分文件夹相同的文件夹(不在主文件夹中 布局文件夹)。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 2012-04-16
    • 2011-01-12
    • 2011-07-28
    • 2012-12-08
    • 2011-03-21
    • 2015-08-30
    • 2017-12-08
    相关资源
    最近更新 更多