Как использовать content_for, чтобы содержимое отображалось в макете
Я тестирую content_for в моем приложении rails 3.2 и следую инструкциям rails, но они относятся к конкретным файлам, и я не могу заставить работать:
файл application.html.erb:
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<%= yield :navigation %> #shouldn't this load the content_for block named :navigation specified in the _main_nav.html.erb partial?
<%= yield %> #this load the index page content
</body>
</html>
Я создал файл макета _main_nav.html.erb (я знаю, что могу выполнить рендеринг с помощью <% = render 'layouts / header'%>, но вместо этого я пытаюсь использовать content_for) _main_nav.html.erb:
<% content_for :navigation do %>
<ul>
<li>Home</li>
</ul>
<% end %>
Они читают RailsGuide http://guides.rubyonrails.org/layouts_and_rendering.html, это должно работать. Но это не так. Я не получаю ошибку. Кажется простым, но я в тупике.
Когда я иду в свой файл index.html.erb, я ожидаю увидеть этот результат:
- Главная
2 ответа
ОК, думаю, у меня есть решение для этого. Ваш код:
<% content_for :navigation do %>
<ul>
<li>Home</li>
</ul>
<% end %>
должен быть в верхней части файла, который загружается. Ваш _header.html.erb является частичным. Если вы переместите этот код в views / tasks / new.html.erb, он будет работать, как и ожидалось.
Однако, чтобы он работал так, как вы хотите, вам нужно настроить файл application.html.erb:
<p>this is where we should see the "Home" link appear that is defined in _header.html.erb:</p>
<section class="header">
<% render 'layouts/header' %>
<%= yield :navigation %>
</section>
Обратите внимание, что я назвал тэг рендера erb без знака =. Это означает, что я не вижу частичное содержимое заголовка, но он загружается. Если вы добавите знак =, то он все еще работает, но также отображает любой другой контент, который вы можете иметь в частичном. Примечание: тег render должен быть выше / перед тегом yield.
Я верю, что вы хотите иметь представление, которое будет содержать ваши content_for
блок. Так что пример будет, если у вас есть следующее:
index.html.erb
<% content_for :head do %>
<%= stylesheet_link_tag 'users' %>
#Above this will load the users stylesheet
<% end %>
<h2>Example</h2>
<ul>
<% @users.each do |users| %>
<li><%= user.name %></li>
<% end %>
</ul>
Затем вывести то, что внутри users
таблицу стилей мы можем получить и передать в символ имени content_for
,
Application.html.erb
<!-DOCTYPE html>
<html>
<head>
<%= yield :head%>
<title>This is my title</title
</head>
<body>
<p>This is a test</p>
<%= yield %>
</html>
Итак, чтобы рассмотреть, что здесь происходит, в моем примере я говорю, что у меня есть users
таблицу стилей, которую я хотел бы загрузить в <head></head>
моего application.html.erb. Для этого я установил content_for
который является помощником Rails и дать ему идентификатор sysmbol, который head
который затем называется в application.html.erb
где я делаю yeild :head
, Так что я получаю мое заявление, когда мой index.html.erb
для этой страницы оказывается application.html.erb
загрузит мой users
таблицы стилей. Надеюсь, это прояснит для вас.
Обновить объяснение
Чтобы добавить к этому еще одну цель комбинации использования content_for
с yield
это позволяет вам вводить данные в макет приложения из любого вида. Так что в качестве другого примера. Вы могли бы иметь следующее:
<% content_for :title do %> My Title<% end %>
Здесь, когда контроллер отображает шаблон представления и комбинирует его с макетом приложения, текст My title
будет заменен yield(:head)
позволяет легко добавлять больше элементов на определенную страницу, если это необходимо. Взгляните на следующий пример:
приложение / просмотров / макеты / application.html.erb
<% if content_for?(:navbar) %>
<%= yield(:navbar) %>
<% else %>
<%# default navbar %>
<section class="navbar"></section>
<% end %>
приложение / просмотров / бла / index.html.erb
<% content_for(:navbar) do %>
<section class="navbar"></section>
<% end %>
Кроме того, обратите внимание, что вы не знаете, как разрабатываете ваше приложение или какую платформу дизайна используете, но вы также можете взглянуть на Rails-Bootstrap-Navbar. Может также быть альтернативой.