使用多个块渲染部分/布局

时间:2014-11-23 15:26:27

标签: ruby-on-rails ruby-on-rails-4 layout view partial

我有一个非常简单的要求 - 我有一个包含标题和正文的布局。它是页面的子布局,而不是页面本身。

这种布局在多个页面中重复,并且它周围的结构可能会发生变化。所以我希望能够将标题的内容和正文的内容与包含它的结构分开。

我的第一次尝试是使用渲染部分作为布局,使用命名的yield来渲染标题和正文:

<header class="Resource-header">
  <%= yield :resource_header %>
</header>
<div class="Resource-body">
  <%= yield :resource_body %>
</div>

然后从我的模板中渲染它:

<%= render layout: 'admin/resource' do %>

  <% content_for :resource_header do %>
  <% end %>

  <% content_for :resource_body do %>
  <% end %>

<% end %>

然而,这没有任何结果。

我开始玩事物的顺序,并发现如果在调用partial之前声明了content_for块,这种方法确实有效:

<% content_for :resource_header do %>
<% end %>

<% content_for :resource_body do %>
<% end %>

<%= render layout: 'admin/resource' do %><% end %>

然而,这只是令人难以置信的hacky。似乎content_for是全局范围的,content_for块和部分渲染之间没有关联。

那么我实现这个目标的正确方法是什么?

3 个答案:

答案 0 :(得分:0)

查看rails演示者https://www.ruby-toolbox.com/categories/rails_presenters 也许你的解决方案是细胞宝石。

答案 1 :(得分:0)

我碰巧遇到了完全相同的问题。

解决方案是: 在您的部分布局文件“ admin / resource”正文中:

<header class="Resource-header">
  <%= yield resource, :resource_header %>
</header>
<div class="Resource-body">
  <%= yield resource, :resource_body %>
</div>

在模板中执行以下操作:

<%= render layout: 'admin/resource' do |resource, section| %>
  <% case section %>
    <% when :resource_header %>
      Resource header shows here.
    <% when :resource_body %>
      Resource body shows here.
  <% end %>

<% end %>

答案 2 :(得分:0)

尽管这个问题现在已经很老了,但我今天也遇到了类似的问题。我想出了……像这样。不需要 gem 或自定义类,只需一些花哨的块使用 ;)

<!-- app/views/layouts/fancy-blocks.html.erb -->
<%
  body, footer = nil
  yield(
    proc {|&blk| body = capture(&blk) },
    proc {|&blk| footer = capture(&blk) }
  )
%>
<section class="body"><%= body %></section>
<footer><%= footer %></footer>
<!-- app/views/some-other/view.html.erb -->
<%= render 'layout/fancy-blocks' do |body, footer| %>
  <% body.call do %>
    BODY
  <% end %>

  <% footer.call do %>
    FOOTER
  <% end %>
<% end %>