Rails, javascript non si carica dopo aver cliccato su link_to helper

Sto avendo qualche problema a caricare il mio javascript quando uso un link_per helper in rail. Quando inserisco manualmente l’url con ‘localhost: 3000 / products / new’ o ricarico la pagina, javascript si carica, ma quando passo attraverso un link come scritto di seguito, jQuery $(document).ready non verrà caricato sul nuova pagina.

Link_to, javascript non viene caricato quando faccio clic su questo link:

  

file products.js

 $(document).ready(function() { alert("test"); }); 

Qualsiasi aiuto sarebbe molto apprezzato. Grazie in anticipo!

Stai usando Rails 4? (Scoprilo facendo rails -v nella tua console)

Questo problema è probabilmente dovuto alla gem Turbolinks appena aggiunta. Rende la tua applicazione si comporta come un’applicazione JavaScript singola pagina. Ha alcuni vantaggi ( è più veloce ), ma sfortunatamente rompe alcuni eventi esistenti come $(document).ready() perché la pagina non viene mai ricaricata. Ciò spiegherebbe perché il JavaScript funziona quando si carica l’URL direttamente, ma non quando si naviga attraverso un link_to .

Ecco un RailsCast su Turbolinks .

Ci sono un paio di soluzioni. Puoi usare jquery.turbolinks come una correzione drop-in, oppure puoi cambiare la tua istruzione $(document).ready() per usare invece la 'page:change' $(document).ready() :

 $(document).on('page:change', function() { // your stuff here }); 

In alternativa, puoi fare qualcosa di simile per la compatibilità con i normali carichi di pagina e Turbolinks:

 var ready = function() { // do stuff here. }; $(document).ready(ready); $(document).on('page:change', ready); 

Se stai usando Ruby su Rails> 5 (puoi controllare eseguendo rails -v nella console) usa 'turbolinks:load' invece di 'page:change'

 $(document).on('turbolinks:load', ready); 

Ho avuto lo stesso problema ma jquery.turbolinks non ha aiutato. Ho notato che devo scavalcare il metodo GET.

C’è il mio esempio:

 <%= link_to 'Edit', edit_interpreter_path(@interpreter), method: :get %> 

Se sei su rails 5 invece di 'page:change' dovresti usare 'turbolinks:load' come questo:

 $(document).on('turbolinks:load', function() { // Should be called at each visit }) 

Fonte: https://stackoverflow.com/a/36110790

Puoi anche avvolgere il tuo link con un div che specifica data-no-turbolink.

Esempio:

  

Fonte: https://github.com/rails/turbolinks

Assicurati di non avere tag linea. (I tag di script in linea sono negativi con i turbolinks).

FWIW, dai documenti Turbolinks , l’evento più appropriato da catturare al posto di $(document).ready è page:change .

page:load ha un avvertimento che non si triggers sulla ricarica della cache …

Un nuovo elemento del corpo è stato caricato nel DOM. Non triggers la sostituzione parziale o quando una pagina viene ripristinata dalla cache, in modo da non sparare due volte sullo stesso corpo.

E poiché Turbolinks sta semplicemente cambiando la vista, page:change è più appropriato.