2012-03-16 1 views
6

J'utilise Rails 3.1.1Impossible de lier ajax: succès formulaire créé avec form_for ....: distance => true

Je suit dans une vue 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') 

Ce qui crée de nouvelles notes sur la soumission. La réponse de mon contrôleur apparaît également correctement dans une console Chrome (onglet Réseau). Mais je n'arrive pas à saisir la réponse.

Je souhaite mettre à jour la liste de notes sur la page après soumission. J'ai essayé de me lier à la réponse ajax afin que je puisse saisir la réponse, mais j'échoue. Par exemple, je pense que cela devrait fonctionner mais pas:

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

Mais aucune alerte n'est déclenchée. Ce qui, je pense, explique pourquoi cela ne marche pas non plus.

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

}) 

Pouvez-vous me signaler ce qui pourrait mal se passer?

+0

Je l'ai fait en utilisant un create.js.erb avec du code qui met à jour l'objet nécessaire. Mais je préfère être en mesure de saisir l'appel ajax, afin que je puisse utiliser l'objet d'erreur ajax si nécessaire. – ReggieB

Répondre

0

Ceci est généralement fait en faisant un fichier create.js.erb dans la section de vue de votre contrôleur (si ce n'est déjà fait) dans lequel vous avez accès à toutes les variables qui sortent de l'action de création, et là vous pouvez rendre votre html

dans votre fichier create.js.erb vous pourriez écrire quelque chose comme

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

lire plus this post je l'ai écrit il y a quelque temps, il explique assez bien l'ensemble des flux

+4

Il est discutable que cela soit "généralement fait". Personnellement, je considère que c'est une mauvaise pratique qui rend votre code moins maintenable. JS devrait aller à votre dossier d'actifs où il appartient. – egze

+0

cela n'a rien à voir avec les assets, c'est comme ça que les gestionnaires javascript sont gérés par défaut dans Rails –

+0

Tout ce que je veux dire c'est juste parce que vous pouvez retourner le javascript du contrôleur ne veut pas dire que c'est la meilleure solution. Question de goût je suppose et je n'aime pas cette approche. – egze

8

Avez-vous essayé 'ajax: complete'?

D'autres choses qui peuvent mal tourner ici:

Code d'état n'a pas été vraiment « réussi ». Cela déclenche le succès dans jQuery

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

Ou le gestionnaire d'événements a été évalué avant le rendu du formulaire. Essayez la délégation de l'événement: (. Attention, ceci est la nouvelle syntaxe jQuery Si vous utilisez ancienne jQuery, ajuster)

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

+0

À partir de jQuery 1.8, la méthode .ajaxSuccess() doit uniquement être attachée au document. – Ziggy

+1

Ceci n'est pas ajaxSuccess(). Rails déclenche toujours l'événement 'ajax: success' sur l'élément avec data-remote = 'true'. – egze

+0

C'est ce truc "UJS", n'est-ce pas? Pardon! Votre réponse est bonne. – Ziggy

1

si vous voulez, vous pouvez mettre votre javascript create.js.erb (code dans ce fichier sera exécuté après la réponse viendra à votre navigateur) Et dans ce fichier, vous pouvez utiliser l'instruction if, comme

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

si dans l'action du contrôleur mis @ok false la réponse sera vide!

Questions connexes