web-dev-qa-db-fra.com

Comment désactiver Turbolinks dans une page spécifique?

J'ai un problème avec un script qui ne fonctionne que lors de l'actualisation de la page et j'essaie donc de désactiver Turbolinks pour cette page uniquement. Le code ci-dessous ne fonctionne pas. Cependant, si j'ajoute l'attribut "data-no-turbolink" directement à la balise body dans application.html.erb, cela fonctionne. Comment désactiver Turbolinks dans ma vue? J'ai suivi la solution affichée ici, Rails 4: désactivez Turbolinks dans une page spécifique mais je ne parviens pas à le faire fonctionner.

J'ai le joyau 'jquery-turbolinks' installé.

policy.html.erb

<% 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>
17
ECsAUtaVku

Vous pouvez utiliser cet oneliner dans votre mise en page:

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

Mais l’autre façon de le faire, que j’utilise le plus souvent, serait de mettre ce morceau de code dans les liens menant à cette page ...

Supposons donc que votre route s'appelle :policy, vous devriez faire ceci:

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

Cela fait longtemps, voici une mise à jour

Récemment, j'ai commencé à utiliser turbolinks 5.0 beta, par:

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

Cela devient beaucoup plus facile ... Tout document ready javascript est chargé, pas de problème ... Tout ce que vous avez à faire est d'ajouter un écouteur à l'événement load.

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

Vous n'êtes pas obligé d'ajouter

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

ou 

$(document).ready(named_function);

Parce que Turbolinks tombera gracieusement à document load si la page est chargée.

22
Ruby Racer

Pour les turbolinks 5 si vous utilisez cette méthode mentionnée ci-dessus:

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

Vous devrez le changer pour:

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

ça va sonner vraiment simple 

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

J'espère que cette aide. 

4
Aldo Delgado

J'ai essayé les autres méthodes mentionnées ici en vain, mais à partir de la documentation Turbolinks 5, vous pouvez insérer cette balise META sur la page que vous souhaitez toujours charger sans Turbolinks.

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

L'ajout d'un attribut de données à tous les liens signifie que vous devez savoir où se trouvent tous ces liens, ce qui est fragile si vous vous trouvez dans une situation où il pourrait y avoir des liens en ligne dans le contenu créé par l'utilisateur.

La méthode d'attribut de données de balise body ne fonctionnait pas pour moi comme prévu: j'aurais supposé qu'il en résulterait le chargement d'une page prise en charge par turbolinks, puis la sélection d'un lien dans un chargement de page standard complet. Cela ne semblait pas être le cas, en particulier avec la navigation par bouton Précédent ou Historique.

L'ajout de cette balise méta oblige Turbolinks 5 à effectuer un rechargement complet de la page avant toute tentative d'insertion de contenu dans le dom. Vous obtenez ce flash classique d'une page blanche, mais si comme moi, vous utilisez du code Javascript externe qui doit se déclencher sans interférence de la part de Turbolinks, c'est le comportement souhaité.

1
stef