为什么Rails使布局选择成为控制器问题而不是视图问题?我可以从视图中选择布局吗?

时间:2011-05-08 15:38:49

标签: ruby-on-rails layout

也许有技术/实现的原因,但在我看来,“布局”显然是视图层的一部分,但Rails似乎只允许在控制器级别指定布局。

我的控制器不应该关心布局......模板应该。有没有办法在.erb文件中指定要使用的布局?

类似的东西:

<%= with_layout :news_feed do %>

  <p>
    My markup in here.
  </p>

<% end %>

或者你能想到的任何其他实现......但是文档似乎只是从控制器的角度来看布局。

实现with_layout帮助器可能不会太难。

编辑|我找到了我正在寻找的东西:

<% render :layout => "some_layout" do %>
  <p>
    My markup here
  </p>
<% end %>

现在提供的ActionController包含:

class ApplicationController < ActionController::Base
  layout nil

然后,每个模板都可以使用这种方法选择自己的布局。

如果您在app / layouts中放置一个名称与控制器匹配的布局,那么将使用该布局,因此您不必严格指定它们是否完全相同。无论哪种方式,花花公子如何编写模板现在可以完全控制它,而不是编写控制器的家伙:)

2 个答案:

答案 0 :(得分:3)

我做了一些研究,但没有找到任何类似于你正在寻找的解决方案。

我认为这可能与指定非默认布局的事实有关,可以通过在your_controllers_name.html.erb下命名文件app/views/layouts来完成。如果始终为特定控制器使用相同的布局,则可以从控制器中删除任何逻辑。也许这就是你要找的东西?如果您没有匹配的布局控制器名称,则将使用默认的application.html.erb

如果需要有条件地渲染不同的布局,则需要在控制器中做出该决定。否则,你会将决策逻辑推到你的视野中。您的视图不应该决定它需要什么样的布局,因为控制器可以做出决策并设置视图所需的任何必要数据。

答案 1 :(得分:1)

一些陈述:

布局与渲染有关 布局只能调用一次 视图 - 是渲染的最高(最后)级别 控制器 - 是第一级渲染层。

所以我可以说只有我们可以设置布局的地方 - 才是控制器。如果我们可以从视图设置布局,那么我们将遇到嵌套布局的问题,因为每个视图(部分也是如此)将调用它自己的布局。

控制器布局如何简单明了。如果我们从孩子们那里设置父级别的观点,那就不清楚了。

你在说什么 - 屈服(content_for)和偏见(render :partial)。它是很好的工具,它们非常完美。