Как отключить Turbolinks на определенной странице?

У меня есть проблема, скрипт работает только при обновлении страницы и поэтому я пытаюсь отключить Turbolinks только к этой странице. Приведенный ниже код не работает. Однако, если я добавлю атрибут "data-no-turbolink" непосредственно к тегу body в приложении.формат html.Эрб он работает. Как отключить Turbolinks в моем представлении? Я следил за решением, размещенным здесь,рельсы 4: отключить Turbolinks в конкретной страницы но я не могу заставить его работать.

У меня есть камень 'с jQuery-turbolinks установлен'.

политика.формат html.Эрб

<% content_for :body do %>
 <% if controller.controller_name == 'pages' && controller.action_name == 'policy' %>
  <body data-no-turbolink="true">
 <% end %>
<% end %>

<div class="row">
 <div class="small-12 medium-8 large-7 columns end">
  <a href="//www.com/" class="nostyle" title="Policy">Policy</a>
  <script>(function (w,d) {var loader = function () {var s = d.createElement("script"), tag = d.getElementsByTagName("script")[0]; s.src = "//cdn.java.com/java.js"; tag.parentNode.insertBefore(s,tag);}; if(w.addEventListener){w.addEventListener("load", loader, false);}else if(w.attachEvent){w.attachEvent("onload", loader);}else{w.onload = loader;}})(window, document); 
  </script>
 </div>
</div>

4 ответов


вы можете использовать этот oneliner в вашем макете:

<body <%= "data-no-turbolinks='true'".html_safe if controller_name=="pages" && action_name=="policy" %>>

но другой способ сделать это, который я использую в основном, это поместить этот кусок кода на ссылки, ведущие на эту страницу...

Итак, предположим, что ваш маршрут называется :policy, вы должны сделать это:

<%= link_to "Policy", policy_path, :"data-no-turbolink" => true %>

прошло много времени, вот обновление

недавно я начал использовать turbolinks 5.0 beta, by:

gem 'turbolinks', '~> 5.0.0.beta'

это становится намного легче... Все document ready javascript загружается, без проблем... Все, что вам нужно сделать, это добавить прослушиватель для события load.

$(document).on('turbolinks:load', named_function );
var named_function = function() {
    // thinks to do on document load
}

вам не нужно также добавлять

$(document).ready(function (){
     // stuff
});

или

$(document).ready(named_function);

, потому что Turbolinks грациозно упадет обратно в document load если страница загружена с трудом.


для turbolinks 5 Если вы используете этот метод, упомянутых выше:

    <%= link_to "Policy", policy_path, :"data-no-turbolink" => true %>

вам нужно изменить его на:

    <%= link_to "Policy", policy_path, :"data-turbolinks" => false %>

это будет звучать очень просто

<%- if params[:controller] == 'controller_name' and params[:action] == 'index' %>
  <body data-no-turbolink="true">
<%- else %>
  <body data-no-turbolink="false">
<%- end %>

Я надеюсь, что это поможет.


Я пробовал другие методы, упомянутые здесь, безрезультатно, но из документов Turbolinks 5 Вы можете вставить этот мета-тег на страницу, которую вы хотите всегда загружать без Turbolinks.

<meta name="turbolinks-visit-control" content="reload">

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

метод атрибута данных тега тела не работал для меня, как я ожидал - Я бы предположил, что загрузка страницы, поддерживаемой turbolinks, а затем щелчок по ссылке, чтобы перейти на страницу, где вы хотите отключить turbolinks, приведет к полной стандартной загрузке страницы. Казалось, что это не так, особенно с кнопкой "Назад" или навигацией по истории.

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