Ruby on rails: использование определенных видов в определенных местах макета

Если у меня есть тег <%= yield %>, то все мои представления отображаются в одном месте в макете. Могу ли я иметь разные теги <%= yield %> для разных видов? Так, как мне это сделать? Благодаря

Ответ 1

Посмотрите ActionView:: Помощники:: CaptureHelper. Вы можете сделать что-то подобное в своих представлениях:

<% content_for :sidebar do %>
  <!-- sidebar content specific to this page -->
<% end %>

Это запустит шаблон внутри блока content_for, но не будет выводиться как часть обычного шаблона yield, он будет сохранен в отдельном буфере для последующего использования. Затем, в том числе в макете, вы можете использовать yield :content_name для вывода содержимого:

<div class="content">
    <%= yield %>
</div>

<div class="sidebar">
    <%= yield :sidebar %>
</div>

Таким образом, в некотором смысле у вас могут быть разные yield для разных представлений, вам просто нужно дать различающемуся содержимому имя с content_for в представлениях и присвоить его с тем же именем в макете.

Подумайте о своем случае, когда вам нужны разные взгляды в разных местах. Скажем, у вас три панели: panel1, panel2 и panel3. Вы можете сделать это в своем макете:

<div id="panel1"><%= yield :panel1 %></div>
<div id="panel2"><%= yield :panel2 %></div>
<div id="panel3"><%= yield :panel3 %></div>

Вам даже не нужно включать простой <%= yield %>, если вы этого не хотите. Затем в ваших представлениях вы можете выбрать панель для отображения содержимого, окружая весь вид с помощью соответствующего content_for. Например, одно из ваших представлений может быть изменено следующим образом:

<% content_for :panel2 do %>
    <!-- Your View -->
<% end %>

Показать на панели 2. Другой может быть предназначен для панели 3, например:

<% content_for :panel3 do %>
    <!-- Your View -->
<% end %>

Ответ 2

Да, вы можете иметь несколько тегов <%= yield %>. Вы можете указать каждый тег yield с именами, подобными этим в базовом представлении.

<%= yield :head %>

<%= yield :footer %>

Затем используйте тег content_for в ваших индивидуальных представлениях.

<% content_for :head do %>
  <%= stylesheet_link_tag 'custom' %>
<% end %>