2010-09-01 5 views
3

J'utilise Rails 3 et JQuery 1.4.2 et j'essaye de me lier au rappel ajax: failure sur une soumission de formulaire distant donnée. Le callback fonctionne bien, cependant, la variable xhr qui est passée semble perdre l'attribut responseText d'une façon ou d'une autre.JQuery et Rails 3 ajax: callback d'échec

Voici ce que mon code ressemble à:

_form.html.haml

= form_for(object, :remote => true) do |f| 
    = form fields and such... 

Javascript quelque part ...

$('form').livequery('ajax:loading', function() { 
    // what to do on ajax loading 
}).livequery('ajax:success', function(data, status, xhr) { 

}).livequery('ajax:failure', function(xhr, status, error) { 
    alert(xhr.responseText); 
}); 

Je rend fondamentalement les messages d'erreur de l'objet de la contrôleur afin que je puisse afficher des notifications d'erreur sur ce rappel. La chose étrange est que je vais dans rails.js, lignes 49-51

error: function (xhr, status, error) { 
    el.trigger('ajax:failure', [xhr, status, error]); 
} 

et écrire manuellement à la responseText de la console, il fonctionne de la façon dont je me attends.

Est-ce que je fais quelque chose de mal? Comment l'objet xhr passerait-il de rails.js à ma liaison?

Répondre

6

J'ai trouvé la réponse, mais je suis confus pourquoi il en est ainsi. Alors rails.js déclenche un ajax: événement d'échec en utilisant le code suivant

$.ajax({ 
    url: url, 
    data: data, 
    dataType: dataType, 
    type: method.toUpperCase(), 
    ... 
    error: function (xhr, status, error) { 
     el.trigger('ajax:failure', [xhr, status, error]); 
    } 
}); 

Quand je lie à cet événement,

$('form').livequery('ajax:failure', function(xhr, status, error) { 

l'état var semble avoir l'attribut responseText et non la XHR comme j'aurais pensé.

Ainsi,

console.log(status.responseText) 

crache mon texte de réponse.

La liaison correcte devrait ressembler à ceci

('form').livequery('ajax:failure', function(event, xhr, status, error) { 

Depuis la première variable est l'événement qui a tiré.

+0

J'ai également réalisé pourquoi les vars ne correspondaient pas. Apparemment, puisque je suis lié à l'événement, la première variable transmise serait l'événement réel lancé avec le xhr, l'état, et l'erreur étant également passée après. – ncavig