【问题标题】:Rendering A Partial / Layout With Multiple Blocks渲染具有多个块的部分/布局
【发布时间】:2015-01-21 07:48:24
【问题描述】:

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

这种布局在多个页面中重复出现,并且它周围的结构可能会发生变化。所以我希望能够将 header 的内容和 body 的内容从包含它的结构中分离出来。

我的第一次尝试是使用渲染部分作为布局,使用命名的 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 %>

但是,这不会渲染任何内容。

我开始玩弄事物的顺序,发现如果 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块和部分渲染没有关联。

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

【问题讨论】:

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


    【解决方案1】:

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

    解决办法是: 在您的部分布局文件“管理员/资源”正文中:

    <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】:

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

    【讨论】:

      【解决方案3】:

      尽管这个问题现在已经很老了,但我今天也遇到了类似的问题。我想出了某事。像这样。不需要 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 %>
      

      【讨论】:

        猜你喜欢
        • 2011-04-17
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-17
        相关资源
        最近更新 更多