2012-05-31 17 views
9

Tengo un formulario que envía un formulario a través de AJAX con: remote => true. Mirando el registro del servidor y FireBug, me da la respuesta 200 OK y se devuelve JSON en forma de:jQuery ajax: el error se ejecuta incluso si la respuesta es correcta 200

{ "email": "[email protected]"} 

entonces tengo estos dos manipuladores:

$('#new_invitation').bind("ajax:success", function(event, data, status, xhr) { 
    alert('test'); 
}); 

$('#new_invitation').bind("ajax:error", function() { 
    alert('error'); 
}); 

e incluso si regreso un 200OK, es el controlador de errores que se dispara. La única vez que logré que el controlador de éxito funcione fue cuando envío una respuesta vacía con 200 en el encabezado.

No puedo entender por qué esto no está funcionando: -S

EDIT 1 ------------ Después de hacer estos cambios:

$('#new_invitation').bind("ajaxSuccess", function(event, data, status, xhr) { 
    alert('test'); 
}); 

$('#new_invitation').bind("ajaxError", function(jqXHR, textStatus, errorThrown) { 
alert('error'); 
    console.log(jqXHR.responseText); 
    console.log(textStatus.responseText); 
    console.log(errorThrown.responseText); 
}); 

I am sigue recibiendo el mismo error. El material de registro me da:

undefined 
[email protected] 
undefined 

Aquí está el código para el formulario (estándar cosas rieles):

<%= form_for @shoot.invitations.new, :url=>shoot_invitations_path(@shoot), :remote => true, :html => {:class => 'form-inline'} do |f| %> 
    <%= f.text_field :email, :'placeholder' => 'ex: [email protected]' %> 
    <%= f.text_field :role, :'placeholder' => 'ex: Photographer' %> 
    <%= f.submit "Invite", :class => 'btn btn-success' %> 
<% end %> 

EDIT 2 ---------

lo hice algunos cambios y ahora parece que mi error es un error de análisis. No entiendo porque este es el JSON que estoy recibiendo de vuelta desde el servidor (data.responseText), que parece todo bien:

{"email":"[email protected]"} 

RESPUESTA --------- he conseguido tener todo el trabajo cuando puse: 'data-type' =>: json en las opciones de formulario. He intentado esto antes y no funcionó porque lo puse en las opciones form_tag y no las opciones de HTML ...

+0

Muéstranos su petición Ajax. –

+2

console.log en los tres argumentos, lo más probable es que obtenga parseerror, lo que significaría json no válido. –

+0

Kevin => Ni siquiera estoy respondiendo con JSON. Lo hice al principio, pero no solo estoy renderizando una cadena de texto y aún falla. – Alain

Respuesta

18

Si el servidor devuelve algo que no es JSON válido, como un espacio único, jQuery generará un error de análisis y lo considerará una solicitud fallida incluso si el código de estado es 200.

A partir de jQuery 1.9 una respuesta completamente vacía se considera una solicitud fallida cuando el tipo se establece en JSON ya que una cadena vacía no es JSON válida. Ver http://jquery.com/upgrade-guide/1.9/#jquery-ajax-returning-a-json-result-of-an-empty-string.

+6

esto debería ser una respuesta aceptada en su lugar ... – j03w

1

Uso ajaxSuccess en lugar de ajax:success y ajaxError en lugar de ajax:error para sus eventTypes.

Ver aquí: http://docs.jquery.com/Ajax_Events

+0

urm .. No estoy seguro acerca de esto. Dice que ajaxError es un evento global; creo que la intención es usarlo para registrar globalmente errores, o tal vez para mostrar y ocultar un ícono de procesamiento. En general, desea que la devolución de llamada de error sea local y se adjunte a la llamada ajax original. Además, dado que se formuló esta pregunta, la devolución de llamada de error está obsoleta de todos modos con preferencia por Deferred.fail (http://api.jquery.com/deferred.fail/) –

+0

@Simon_Weaver, el OP indica que fue parte de la respuesta. En ese momento, no fue desaprobado. –

+0

es por eso que dije 'Además, ya que esta pregunta fue hecha ...' :-) No estoy seguro de lo que quieres decir con que es parte de la respuesta, aunque –

8
  1. Compruebe que el tipo de datos de $ .ajax se establece en jsonp

  2. tratar de volver {correo electrónico: "[email protected]"}

+0

sin las citas en el correo electrónico – jsshah

+0

Encontré mi problema (pregunta editada) y te doy +1 porque tú eres el que me trajo. – Alain

2

JSON.parse ('') arroja un error. Para mí, eso es estúpido, debería volver indefinido. he añadido el código de mi aplicación

#HACK JSON.parse('') should return undefined, not throw an error 
_parse = JSON.parse 
JSON.parse = (str) => 
    unless str == '' 
    _parse.apply JSON, arguments 

o para U pobres no usar CoffeeScript (no probado)

//HACK JSON.parse('') should return undefined, not throw an error 
var _parse = JSON.parse 
JSON.parse = function(str) { 
    if (str !== '') 
    return _parse.apply(JSON, arguments); 
    else 
    return undefined; 
} 
Cuestiones relacionadas