2011-08-29 15 views
5

Tengo una forma sencilla:¿Por qué Rails UJS ajax: bind éxito se llama dos veces?

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

he atado una devolución de llamada al evento ajax:success:

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

Al hacer clic en el botón Post!, la Post Created aparece dos veces . ¿Por qué?

Estoy usando Rails 3.1 que de forma predeterminada usa jquery-ujs.

Respuesta

5

Me paso algo similar al actualizar una aplicación de Rails 3.0 a 3.1, fue mi error. En su cheque

app/assets/javascripts/application.js 

que su no están pidiendo el doble de los ayudantes carriles, tengo problemas utilizando

//= require_tree . 

me han quitado esto y justo a la izquierda

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

yo borrado demasiado app/assets/javascripts/rails.js, el archivo fue generado por la gema jquery-rails, pero esto ya no es necesario

+0

Tengo el mismo problema, y ​​mis activos de JavaScript no se incluyen dos veces. ajax: el éxito todavía se llama dos veces, incluso sin la directiva require_tree activa. –

+0

Gracias. Yo tuve el mismo problema. La eliminación de require_tree ayudó a resolver el problema. –

9

Esto se debe a que su página está cargando el código jquery_ujs dos veces en modo de desarrollo cuando existen activos precompilados en /public/assets.

En el modo de desarrollo Javascript requries están cargados de separar las etiquetas: jquery, jquery_ujs.js, myscripts.js y finalmente applications.js. El problema ocurre cuando existe una precompilación application.js y se usa desde /public/assets - contiene la compilación de todos los archivos anteriores. Esto se desencadena por assets:precompile tarea de rake.

La solución es eliminar el directorio /public/assets en desarrollo, luego se usa application.js (desde /app/assets/javascript) que no incluye archivos anteriores. Generalmente no usa assets:precompile tarea de rake en el desarrollo.

actualización

Adición config.serve_static_assets = false-development.rb también resuelve un problema para mí, sin tener que preocuparse por /public/assets.

0

Para mí el Gotcha era la opción

config.assets.debug = true 

.

+0

¿qué quieres decir? Estoy teniendo este problema y también tengo esta línea en mi desarrollo.rb. ¿Debería eliminarlo? – Blake

+1

En realidad lo encontré con el enfoque de "intentar y equivocar" porque vi en Firebug, que el javascript se cargó dos veces y, por lo tanto, la vinculación se realizó dos veces (lo que dio como resultado la llamada ajax redundante).De todos modos, sospecho que fue porque precompilé los activos localmente (debido a la implementación en heroku) en combinación con debug = true. De todos modos, cuando configuré 'config.assets.debug = false' ya no estaba incluido dos veces. – Beffa

+0

Gracias por la respuesta. Resulta que mi problema también fue que el script cargó dos veces. Me estaba moviendo alrededor de los elementos dom, lo que provocó que mi script volviera a ejecutarse. Lo arreglé ejecutando el script después de que se activara el evento window.onload. – Blake

Cuestiones relacionadas