代码之家  ›  专栏  ›  技术社区  ›  james

渲染多个部分时多次调用Rails yield

  •  0
  • james  · 技术社区  · 6 年前

    我有多个正在渲染的部分,我的想法是这些部分渲染成一行,并且有不同的内容。对于这样的输出:

    <div class="container">
      <div class="row" data-page='1'>
        <h1>Page 1 Title</h1>
      </div>
      <div class="row" data-page='2'>
        <h1>Page 2 Title</h1>
      </div>
      <div class="row" data-page='3'>
        <h1>Page 3 Title</h1>
      </div>
    </div>
    

    我正在编写这样的代码:

    <div class="container">
      <% (1..3).each do |p| %>
        <div class="row" data-page="<%= p %>"> 
          <%= render "partials/o#{p}" %>
          <h1><%= yield :title %></h1>
        </div> 
      <% end %>
    </div>
    
    <!-- o1 partial -->
    <% content_for :title do %>
       Page 1 Title
    <% end %>
    
    <!-- o2 partial -->
    <% content_for :title do %>
       Page 2 Title
    <% end %>
    
    <!-- o3 partial -->
    <% content_for :title do %>
       Page 3 Title
    <% end %>    
    

    上述代码的问题是,在第2页和第3页上,它也包含前几页的内容。像这样:

    <div class="container">
      <div class="row" data-page='1'>
        <h1>Page 1 Title</h1>
      </div>
      <div class="row" data-page='2'>
        <h1>Page 1 Title
          Page 2 Title</h1>
      </div>
      <div class="row" data-page='3'>
        <h1>Page 1 Title
          Page 2 Title
          Page 3 Title</h1>
      </div>
    </div>
    

    如何避免这种情况并返回到所需的输出?

    2 回复  |  直到 6 年前
        1
  •  0
  •   max Mike Williams    6 年前

    你完全误解了 captures helper 作品

    每个 yield 块实际上是等待整个视图完成渲染,以确保已提供所有内容。您可以将每个命名的产出视为缓冲区。在您的情况下,即使有多个调用要生成,它们都指向 :title 缓冲器

    content_for 使用2个以上的参数调用时,将内容写入缓冲区( content_for(:foo, 'bar') 或在使用一个参数调用时输出缓冲区。请注意 content\u for 按设计连接内容:

    <%= yield :poem %>
    <% content_for :poem, "Roses are red" %>
    <% content_for :poem, " violets are blue" %>
    # => "Roses are red violets are blue"
    

    可以使用 flush: true 替换以前捕获的任何内容的选项。

    <%= yield :poem %>
    <% content_for :poem, "This gets flushed..." %>
    <% content_for :poem, "Roses are red violets are blue", flush: true %>
    # => "Roses are red violets are blue"
    

    您还可以使用 provide 直接流入产量区块。

    但对于这种情况,我想知道的是,如果使用一个简单的局部变量,是否不需要太多的麻烦就可以完成这项工作。

        2
  •  0
  •   John    6 年前

    只需将您的部分替换为同花顺提及:

    <!-- o1 partial -->
    <% content_for :title, flush: true do %>
       Page 1 Title
    <% end %>
    
    <!-- o2 partial -->
    <% content_for :title, flush: true do %>
       Page 2 Title
    <% end %>
    
    <!-- o3 partial -->
    <% content_for :title, flush: true do %>
       Page 3 Title
    <% end %>