Вы загружаете Turbolinks из элемента <script>внутри элемента <body>- приводит к дублированию элементов в представлении - PullRequest
0 голосов
/ 29 января 2020

У меня очень странная проблема. Вчера я добавил опцию автозаполнения в мою форму в приложении Rails (Algolia Places). Я также установил webpacker для работы с пакетами внутри моего приложения. Итак, получается, что в моем адресе. html .erb я теперь получаю две формы, отображаемые друг под другом: одну с автозаполнением и другую без. См. Изображение ниже (первая форма имеет адрес автозаполнения, а нижняя - нет).

enter image description here

Я предполагаю, что проблема в моем приложении. html .erb, где код на данный момент выглядит следующим образом:

<!DOCTYPE html>
<html>
  <head>
    <title>Neigbornow</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <meta>

      <%= yield %>
      <%= javascript_include_tag 'application' %>
      <%= javascript_pack_tag 'application' %>
      <%= javascript_pack_tag 'autocomplete' %>
    </meta>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>

    <% if @user.nil? %>
      <%= render 'layouts/header' %>
    <% elsif user_signed_in? && current_page?(user_step_path) || %>
      <%= render partial: "layouts/header_address" %>
    <% else %>
      <%= render 'layouts/header_rest' %>
    <% end %>
      <%= render 'layouts/flash' %>
    <%= yield %>
  </body>
</html>

Консоль выдает следующую ошибку:

You are loading Turbolinks from a <script> element inside the <body> element. This is probably not what you meant to do!

Load your application’s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.

For more information, see: https://github.com/turbolinks/turbolinks#working-with-script-elements

——
Suppress this warning by adding a `data-turbolinks-suppress-warning` attribute to: <script src="/assets/turbolinks.self-569ee74eaa15c1e2019317ff770b8769b1ec033a0f572a485f64c82ddc8f989e.js?body=1"></script>

Если я изменяю

<%= yield %>

на

<%= yield :js %>

Вторая форма исчезает, но функция автозаполнения также исчезает. То же самое произойдет, если я перейду

<%= yield %>

до конца. Это довольно загадка для меня. Мне действительно нужна помощь по этому вопросу, так как для inte на этом нет никаких файлов rnet.

PS Вот макеты / заголовок

<nav class="navbar navbar-inverse navbar-fixed-top">
  <div class="container">
    <div class="navbar-header">
      <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
        <span class="icon-bar"></span>
      </button>
      <div class="navbar-brand pull-left" href="#">
        <img src="<%= image_path('logo_transparent.png') %>" width="147" height="70" class="d-inline-block align-left mr-2">
      </div>
    </div>
    <div class="navbar-collapse collapse">

        <ul class="nav navbar-nav pull-right">
          <li><%= link_to 'Home', root_path, method: :get %></li>
          <li><a>About</a></li>
          <li><a>Search</a></li>
          <li><a>Contact</a>

          <% if user_signed_in? %>
            <% if current_user.profile == nil %>
              <li><span class="bg-primary text-white rounded"><%= link_to 'Create profile', new_user_profile_path(current_user.id) %></span></li>
            <% else %>
              <li><span class="bg-primary text-white rounded"><%= link_to 'My profile', user_profile_path(@user) %></span></li>
            <% end %>

          <li><span class="bg-primary text-white rounded"><%= link_to 'Log out', destroy_user_session_path, method: :delete %></span></li>

        <% else %>
          <li><div class="log-in-btn"><button class="btn" type="submit"><%= link_to 'Log in', new_user_session_path %></button></div></li>
        <% end %>
        </ul>

    </div> <!--/.nav-collapse -->
  </div>

Но я фактически рендеринг другого заголовка на эта страница - пустая, как вы можете видеть

<nav class="navbar navbar-inverse navbar-fixed-top">
  <div class="container">
    <div class="navbar-header">
      <div class="navbar-brand pull-left" href="#">
        <img src="<%= image_path('logo_transparent.png') %>" width="147" height="70" class="d-inline-block align-left mr-2">
      </div>
    </div>
  </div>
</nav>

На первой странице, без функции автозаполнения, эта проблема не появляется.

PS - отредактированная версия

<!DOCTYPE html>
<html>
  <head>
    <title>Neigbornow</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= yield :meta %>
    <%= yield %>
    <%= javascript_include_tag 'application' %>
    <%= javascript_pack_tag 'application' %>
    <%= javascript_pack_tag 'autocomplete' %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
     <%= yield :css %>

  </head>
  <body>
    <% if @user.nil? %>
      <%= render 'layouts/header' %>
    <% elsif user_signed_in? && current_page?(user_step_path) || %>
      <%= render partial: "layouts/header_address" %>
    <% else %>
      <%= render 'layouts/header_rest' %>
    <% end %>
      <%= render 'layouts/flash' %>
    <!- I would really recommend that you wrap this in an element -!>
    <div id="main">
    </div>
  </body>
</html>

Ответы [ 2 ]

1 голос
/ 29 января 2020

Во-первых, использование такого метатега совершенно недопустимо. Метатег является пустым элементом, и поэтому НИКОГДА не имеет закрывающего тега или содержимого.

Это допустимые примеры метатегов:

<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="og:url" content="http://www.nytimes.com/2015/02/19/arts/international/when-great-minds-dont-think-alike.html" />
<meta property="og:type" content="article" />

Во-вторых, у вас есть два «безымянный доход» в вашем макете. Ваш макет должен содержать только один безымянный выход, как тот, в котором фактически выводится шаблон. В этом случае содержимое вводится дважды, и вы получаете полностью искаженный документ, и ваша ошибка, когда браузер переходит в режим полного отката.

Причина, по которой turbolinks предупреждает вас о том, что «вы загружаете Turbolinks из элемента script внутри элемент тела. " является вышеупомянутым режимом наклона. Вы вводите кучу элементов, которые не разрешены в теге <head>, и браузер пытается разобраться с мусором HTML, добавив тег <body>.

Ваше решение удалить Второй выход на самом деле полностью помешан. Это не то, что вы хотите вообще. Ваш вид не должен отображаться внутри элемента <head> страницы. Это совершенно недопустимо HTML и приведет к полностью искаженному документу, который будет вести себя очень непредсказуемо.

Если вы хотите, вы можете иметь множество именованных выходов в макете, если вы хотите, чтобы шаблоны визуализировали вставку содержимого в макет («вне коробки»).

<!DOCTYPE html>
<html>
  <head>
    <title>Neigbornow</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>
    <%= yield :meta %>
    <%= javascript_include_tag 'application' %>
    <%= javascript_pack_tag 'application' %>
    <%= javascript_pack_tag 'autocomplete' %>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= yield :js %>
    <%= yield :css %>
  </head>
  <body>
    <% if @user.nil? %>
      <%= render 'layouts/header' %>
    <% elsif user_signed_in? && current_page?(user_step_path) || %>
      <%= render partial: "layouts/header_address" %>
    <% else %>
      <%= render 'layouts/header_rest' %>
    <% end %>
      <%= render 'layouts/flash' %>
    <!- I would really recommend that you wrap this in an element -!>
    <div id="main">
      <%= yield %>
    </div>
  </body>
</html>

Затем можно использовать content_for для предоставления содержимого для именованных выходов из представления:

<h1><%= @article.title %></h1>

<% content_for :meta do %>
  <meta property="og:title" content="<%= @article.title %>" />
<% end %>

См .:

1 голос
/ 29 января 2020

Я думаю, потому что у вас есть два yield утверждения. Я полагаю, вам не нужен один внутри тегов <meta>?

yield внутри тега meta загружает форму перед включением javascript. Это может быть причиной того, что первая форма не имеет автозаполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...