我有一个非常简单的要求 - 我有一个包含标题和正文的布局。它是页面的子布局,而不是页面本身。
这种布局在多个页面中重复,并且它周围的结构可能会发生变化。所以我希望能够将标题的内容和正文的内容与包含它的结构分开。
我的第一次尝试是使用渲染部分作为布局,使用命名的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
块和部分渲染之间没有关联。
那么我实现这个目标的正确方法是什么?
答案 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 %>