假设我有:

# layouts/application.html.erb

<html>
  <head>
    <body>
      <p>Hi</p>
      <%= yield :toolbar1 %>
      <%= yield :toolbar2 %>
      <%= yield %>
    </body>
  </head>
</html>

以及视情况而定的另外两种布局:

# layouts/toolbar1.html.erb
<% content_for :toolbar1 do %>
  <p>toolbar1</p>
<% end %>

# layouts/toolbar2.html.erb
<% content_for :toolbar2 do %>
  <p>toolbar2</p>
<% end %>

如何在每个控制器的基础上有条件地加载:toolbar1toolbar2,例如:

# Controller where *only* :toolbar1 should be present on show action
class TestController < ApplicationController
  def show
    render "show", layout: "toolbar1"
  end
end

...不起作用,因为它只try 加载toolbar1.html.erb而不加载application.html.erb布局.基本上,我想组成布局控制器的控制器(如果你愿意,路由由路由).

推荐答案

可能有更好的方法来做你需要做的事情.

但这是可行的:

# layouts/toolbar1.html.erb

<% content_for :toolbar1 do %>
  <p>toolbar1</p>
<% end %>

<%= render template: "layouts/application" %>

其余的都是一样的.


作为替代方案,模板继承可用于以下方面:

# app/views/application/_toolbar.html.erb

# empty
<!-- layouts/application.html.erb -->

<html>
  <head></head>
  <body>
    <%= render "toolbar" %>
    <%= yield %>
  </body>
</html>

然后覆盖_toolbar部分:

<!-- app/views/*/_toolbar.html.erb -->

<div>a toolbar for some controller</div>

100

Ruby-on-rails相关问答推荐

如何在_serialize之前执行代码?""或者如何在序列化属性之前对属性进行清理?

在has_many关系中由两个条件 Select

Rails版本7.1.2:当验证失败且控制器发送422状态时,JS停止工作

CanCanCan、Pagy 和 Meil​​iSearch,如何组合这 3 个 gem?

如何启动 rails 控制台并专门使用测试数据库?

为什么在保存对象后使用重新加载方法? (Hartl Rails Tut 6.30)

FactoryGirl + Faker - 为数据库种子数据中的每个对象生成相同的数据

了解 Rails 验证:allow_blank 有什么作用?

未定义的方法 attr_accessible

form_tag 是否与 Simple_form 一起使用?

如何在rails中异步加载部分页面

Rails:将所有未知路由重定向到 root_url

Rails 4模块的未初始化常量

如何使用 Rails 3 获取请求的目标控制器和操作?

Rails,Docker:主机不存在:默认

如何翻译 ActiveRecord 模型类名称?

Rails 3 设计,current_user 在模型中不可访问?

使用 heroku 和 namecheap 设置自定义域

从 Rails 控制器获取主机名

Ruby 更新后:测试失败,assets资源 未声明为在生产中预编译