Rails 5.2.3 content_for не работает как указано - PullRequest
0 голосов
/ 07 ноября 2019

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

Я пытаюсь добавить некоторые данные начальной загрузки из разных представлений, каждый из которых имеет свое содержимое content_for в зависимости от расположения в коде. Затем в моем application.html.erb я вызываю партиал, который отображает данные крошки. Но данные пусты при просмотре источника.

Я думал, что у меня может быть проблема с заказом, я не думаю, что это так, но я не совсем уверен.

Вот порядок событий. Я звоню new.html.erb , чтобы отобразить представление для нового, а также установить данные content_for. Затем в макете я вызываю частичный _breadcrumb.html.erb в теле основного макета для отображения данных content_for.

new.html.erb

<% content_for :breadcrumb do %>
  <li class="breadcrumb-item"><%= link_to "Home", root_path %></li>
  <li class="breadcrumb-item"><%= link_to "Examples", examples_path %></li>
  <li class="breadcrumb-item active">Horizontal Form</li>
<% end %>

<div class="app-example container">
  <div class="row">
    <%= render partial: "bootstrap", layout: "card_bootstrap", locals: { title: "Horizontal Form" } %>
    <%= render partial: "form",      layout: "card_simple_form", locals: { title: "Horizontal Form" } %>
  </div>

  <%= render partial: "shared/tipps" %>

  <%# move modals to bottom %>
  <%= render partial: "shared/modal", locals: { id: "modal-bootstrap", title: "Bootstrap",
      content: render_source(File.read(File.join(Rails.root, 
      'app/views/examples/horizontals/_bootstrap.html.erb'))) } %>

  <%= render partial: "shared/modal", locals: { id: "modal-simpleform", title: "Simple Form",
      content: render_source(File.read(File.join(Rails.root, 
      'app/views/examples/horizontals/_form.html.erb'))) } %>
</div>

_breadcrumb.html.erb

<div class="app-breadcrumb container">
  <div class="d-flex flex-row justify-content-between">
    <ol class="breadcrumb bg-transparent px-0">
      <%= yield :breadcrumb %>
    </ol>

    <div>
      <button type="button" class="btn btn-sm btn-outline-secondary mt-2 mr-2 d-none" data-                tooltip data-placement="bottom" data-trigger="hover" title="compare by clicking fast" data-toggle="button" aria-pressed="false" autocomplete="off">
        Swap
      </button>

      <div class="btn-group btn-group-toggle mt-2 d-none" data-toggle="buttons">
        <label class="btn btn-sm btn-outline-secondary">
          <input type="radio" name="view" id="stack" autocomplete="off"> Stack
        </label>
        <label class="btn btn-sm btn-outline-secondary active">
          <input type="radio" name="view" id="split" autocomplete="off" checked> Split
        </label>
      </div>
    </div>
  </div>
</div>

application.html.erb

<!DOCTYPE html>
<html>
  <head>
     <title><%= full_title(yield(:title)) %></title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= stylesheet_link_tag "application", media: "all",
                         "data-turbolinks-track": 'reload' %>
    <%= javascript_include_tag "application", "data-turbolinks-track": 'reload' %>
    <meta name="viewport" content="width=device-width, initial-scale=1">
  </head>
  <body data-spy="scroll" data-target=".bs-docs-sidebar">
    <%= render "header" %>
    <div class="container">
      <%= render "flash" %>
      <%= render "breadcrumb" %>

      <%= yield %>

      <%= render "footer" %>
      <%= debug(params) if Rails.env.development? %>
<!-- This debug code shows the HTTP headers/environment -->
<!-- ul>
<% request.env.each do |item| %>
    <li><%= item[0] %> : <%= item[1] %></li>
<% end %>
</ul -->
    </div>
  </body>
</html>

Я знаю, что частичное визуализируется, потому что все, кроме данных content_for, отображается в источнике (и на экране.)

Однако я ничего не понимаю, где в коде yield: breadcrumb. Источник просто показывает

<ol class="breadcrumb bg-transparent px-0">
</ol>

Может кто-нибудь предложить более глубокое понимание этого вопроса? Если мне нужно предоставить больше информации, просто дайте мне знать об этом. Я начинающий программист рельсов, и любая помощь будет признательна.

1 Ответ

0 голосов
/ 15 ноября 2019

Оказывается, это была проблема с маршрутизацией, а не проблема с content_for и yield . Я внес некоторые изменения в каталог, чтобы лучше организовать приложение, и используемый маршрут указывал на более старую версию файла в другом каталоге. Тот, который не был правильно настроен content_for . Маршрут был правильно изменен в файле rout.rb, но не обновлен правильно в ссылке на представление.

Я ценю всех, кто смотрел на проблему, и я прошу прощения за потраченное время на то, что должно было быть очевидной проблемой. По крайней мере, оглядываясь на это сейчас. Это хороший обучающий момент, чтобы не упускать из виду все детали, которые, как вам кажется, вы хорошо знаете, когда сосредотачиваетесь на чем-то новом, что вы пытаетесь добавить. Урок усвоен!

...