Как использовать 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. Может также быть альтернативой.

Другие вопросы по тегам