2012-03-16 12 views
6

sto usando Rails 3.1.1Incapace di legare l'Ajax: il successo di modulo creato con form_for ....: a distanza => true

Ho il seguente in una vista Haml:

= form_for booking.notes.build, :remote => true do |f| 
    = f.text_area(:content) 
    = f.hidden_field(:noteable_id) 
    = f.hidden_field(:noteable_type) 
    = f.submit('Add note') 

Che crea nuove note sull'invio. Anche la risposta dal mio controller appare correttamente in una console di Chrome (scheda Rete). Ma non riesco ad afferrare la risposta.

Desidero aggiornare l'elenco delle note sulla pagina dopo l'invio. Ho cercato di legarmi alla risposta ajax in modo da poter afferrare la risposta, ma sto fallendo. Ad esempio, penso che questo dovrebbe funzionare ma non lo fa:

$('#new_note').bind('ajax:success', function() { 
    alert('Hi'); 
}); 

Ma non viene attivato alcun avviso. Ciò che penso spiega perché anche questo non funziona.

$('#new_note').bind("ajax:success", function(evt, data, status, xhr){ 
    // Insert response partial into page below the form. 
    $(this).parent.append(xhr.responseText); 

}) 

Potete per favore indicarmi cosa potrebbe andare storto?

+0

Ho risolto questo problema utilizzando un file create.js.erb con codice che aggiorna l'oggetto necessario. Ma preferirei essere in grado di prendere la chiamata ajax, in modo da poter usare l'oggetto errore ajax, se necessario. – ReggieB

risposta

0

Questo in genere è realizzato facendo un file create.js.erb nella sezione visualizzazione del controller (se non l'hanno già fatto), in cui si ha accesso a tutto ciò che le variabili di venire fuori dell'azione creare, e non ci si può rendere il vostro html

nel file create.js.erb si potrebbe scrivere qualcosa di simile a

$("#new_note").html('<%= escape_javascript(render partial: "path/to/partial") %>'); 

maggiori informazioni in this post che ho scritto qualche tempo fa, si spiega praticamente l'intero flusso

+4

È discutibile che questo sia "generalmente fatto". Personalmente ritengo che sia una cattiva pratica che rende il tuo codice meno gestibile. JS dovrebbe andare nella cartella delle risorse in cui appartiene. – egze

+0

questo non ha nulla a che fare con le risorse, è come i gestori javascript sono gestiti di default in Rails –

+0

Tutto quello che sto dicendo è - solo perché è possibile restituire javascript dal controller - non significa che sia la soluzione migliore. Questione di gusti credo e non mi piace questo approccio. – egze

8

Hai provato 'ajax: complete'?

Altre cose che possono andare male qui:

Codice di stato non era veramente "di successo". Questo innesca il successo in jQuery

if (status >= 200 && status < 300 || status === 304) { 

Oppure il gestore eventi è stato valutato prima del rendering del modulo. Prova delegazione evento: (. Attenzione, questa è la nuova sintassi jQuery Se si utilizza jQuery vecchio, regolare di conseguenza)

$("body").on('ajax:success', '#new_note', function(){...}) 

+0

A partire da jQuery 1.8, il metodo .ajaxSuccess() deve essere collegato solo al documento. – Ziggy

+1

Questo non è un jaxSuccess(). Rails attiva ancora l'evento 'ajax: success' sull'elemento con data-remote = 'true'. – egze

+0

Questa è la roba di "UJS", giusto? Scusate! La tua risposta è buona. – Ziggy

1

se si vuole, si può mettere il javascript in create.js.erb (codice in questo file viene eseguito dopo che la risposta arriverà al vostro browser) E in questo file è possibile utilizzare if, come

<% if @ok %> 
    //your code 
<% end %> 

se nell'azione del controller impostato @ok a false la risposta sarà vuoto!

Problemi correlati