Rails yield 和 content_for 奇怪的行为,`yield :filter` 只有放在默认 yield 之后才有效

Rails yield and content_for wieird behaviour, `yield :filter` only work if placed after default yield

假设我有这个部分,我正在尝试渲染

#layouts/_subheader.html.erb
<div class="subheader">
   <%= yield %>
   <%= yield :filters %>
</div>

当我在这样的视图中使用这个部分时

<%= render 'layouts/sub_header' do %>
   <h2> Content For Yield </h2>
   <% content_for :filters do %>
      <h2> Content for Filters </h2>
   <%  end %>
<% end %>

我得到的 HTML 输出为

<div class="subheader">
   <h2> Content For Yield </h2>
   <h2> Content for Filters </h2>
</div>

这按预期工作,但是当我更改部分

yield 标签的顺序时出现问题

而不是上面的,如果我将部分重写为

#layouts/_subheader.html.erb
<div class="subheader">
   <%= yield :filters %>
   <%= yield %>
</div>

我得到的输出为

<div class="subheader">
   <h2> Content For Yield </h2>
</div>

未呈现 content_for :filters

我在这里做错了什么?这是正确的行为还是我做错了什么?

如果我必须让 yield :filters 的内容出现在普通 yield

之前,我该怎么办

编辑:-

我试过了

#layouts/_subheader.html.erb
<div class="subheader">
   <%= content_for :filters %>
   <%= yield %>
</div>

但似乎效果不佳。

感谢 reddit 上的所有人和@Ezhil 我找到了解决方案,这就是我所做的

我所做的是将 content_for 捕获组放在渲染之前,像这样

#index.html.erb
<% content_for :filters do %>      
  <h2> Content for Filters </h2> 
<% end %> 

<%= render 'layouts/sub_header' do %>   
  <h2> Content For Yield </h2> 
<% end %>

在我的部分

#layouts/_subheader.html.erb 
<div class="subheader">     
   <%= content_for :filters %>     
   <%= yield %>
</div>

这是因为直到第一次 yield 才执行该块,所以在运行之前没有捕获任何内容。