2011-08-29 7 views
5

Ho una forma semplice:Perché Rails UJS ajax: il bind del successo viene chiamato due volte?

= form_for(posts_path, :id => "new_post", :remote => true) do 
    = text_field_tag "post[input]" 
    = submit_tag "Post!" 

Ho legato un callback per l'evento ajax:success:

$("form#new_post").bind("ajax:success", function(xhr, data, status){ 
    alert("Post Created!"); 
}); 

quando clicco sul tasto Post!, il Post Created viene in su due volte. Perché?

Sto usando Rails 3.1 che per impostazione predefinita utilizza jquery-ujs.

risposta

5

Una cosa simile è accaduta a me l'aggiornamento di un'applicazione da Rails 3.0 a 3.1, è stato un mio errore. Nella tua

app/assets/javascripts/application.js 

verifica che il tuo non chiamano due volte le rotaie aiutanti, ho problemi con

//= require_tree . 

Ho rimosso questa e appena lasciato

//= require jquery 
//= require jquery_ujs 
//= require myscripts 

ho cancellato anche app/assets/javascripts/rails.js, il file è stato generato da jquery-rails gem ma non è più necessario

+0

Ho lo stesso problema e le mie risorse javascript non vengono incluse due volte. ajax: il successo viene ancora chiamato due volte, anche senza la direttiva require_tree attiva. –

+0

Grazie. Ho avuto lo stesso problema. La rimozione di require_tree ha aiutato a risolvere il problema. –

9

Questo perché la pagina sta caricando il codice jquery_ujs due volte in modalità di sviluppo quando le risorse precompilate sono presenti in /public/assets.

In modalità di sviluppo javascript requries sono carichi di separare i tag: jquery, jquery_ujs.js, myscripts.js e infine applications.js. Il problema si verifica quando esiste una precompilazione application.js ed è utilizzata da /public/assets - contiene la compilazione di tutti i file precedenti. Questo è attivato dal task rake assets:precompile.

La soluzione è quella di rimuovere la directory /public/assets sullo sviluppo, quindi viene utilizzato application.js (da /app/assets/javascript) che non include i file precedenti. Generalmente non utilizza l'attività di rake assets:precompile durante lo sviluppo.

Aggiornamento

Aggiunta config.serve_static_assets = false-development.rb risolve anche un problema per me, senza preoccuparsi di /public/assets.

0

Per me la Gotcha era l'opzione

config.assets.debug = true 

.

+0

cosa intendi? Sto avendo questo problema e ho anche questa linea nel mio development.rb. Dovrei rimuoverlo? – Blake

+1

In realtà l'ho trovato con l'approccio "try and error" perché ho visto in Firebug che il javascript è stato caricato due volte e quindi l'associazione è stata eseguita due volte (il che ha provocato la chiamata ajax ridondante).Comunque, ho il sospetto che fosse perché ho precompilato le risorse localmente (a causa della distribuzione in heroku) in combinazione con il debug = true. Ad ogni modo, quando ho impostato 'config.assets.debug = false' non è stato più incluso due volte. – Beffa

+0

Grazie per la risposta. Risulta che il mio problema era anche che lo script veniva caricato due volte. Mi stavo muovendo attorno agli elementi dom, cosa che ha causato la ripetizione del mio script. L'ho risolto eseguendo lo script dopo l'evento window.onload attivato. – Blake