Я не уверен, как yield
функционирует на уровне ERB, но я знаю, как это работает при применении к макетам.
Вот пример файла layout.html.erb:
<html>
<head>
<title> <%= @title || 'Plain Title' %> </title>
<%= yield :head %>
</head>
<body>
<div id='menu'>
<%= yield :menu %>
</div>
<div id='content'>
<%= yield %>
</div>
<div id='footer'>
<%= yield :footer %>
</div>
</body>
Я определил 4 выхода (: head,: menu,: footer и default) и переменную экземпляра @ title.
Теперь действия контроллера могут отображать эти слоты в эти места. Обратите внимание, что представление отображается перед макетом, поэтому я могу определить переменную, например @title, в представлении и определить ее в макете.
Примеры просмотров:
О странице
<% @title = 'About' %>
<% content_for :menu do %>
<%= link_to 'Back to Home', :action => :home %>
<% end %>
We rock!
<% content_for :footer do %>
An Illinois based company.
<% end %>
Страница редактирования
<% @title = 'Edit' %>
<% content_for :head do %>
<style type='text/css'> .edit_form div {display:inline-block;} </style>
<% end %>
<% form_for :thing, :html => {:class => 'edit_form'} do |f| %>
...
<% end %>
Вы можете смешивать и сопоставлять данные, в которые вы хотите поместить данные, и то, что происходит в content_for :something
, будет вставлено в соответствующий yield :something
в файле макета.
Он работает даже для частичных операций, часть может вставить свой собственный блок content_for: что-то, что будет добавлено с любыми другими вызовами content_for.