with type rails couldn bootstrap application jquery ruby-on-rails rest

type - jquery no llama al método de éxito en $.ajax para los rieles estándar REST DELETE answer



rails jquery ajax (3)

Tal vez ese problema no es nuevo, pero no encontré nada similar. Tengo tal código jQuery:

$.ajax({ url : (''/people/''+id), type : ''DELETE'', dataType : ''json'', success : function(e) { table.getItems(currentPage); } });

El controlador My Rails tiene este aspecto:

def destroy @person = Person.find(params[:id]) @person.destroy respond_to do |format| format.html { redirect_to(people_url) } format.json { render :json => @person, :status => :ok } end end

Esto está funcionando.

Pero cuando uso lo siguiente (según lo generado por el estándar), la devolución de llamada success no se llama:

def destroy @person = Person.find(params[:id]) @person.destroy respond_to do |format| format.html { redirect_to(people_url) } format.json { head :ok } end end

Probado bajo los rails 3.0.3 , jQuery 1.4.2 y Firefox 3.6.13 .
Firebug dice, esa consulta se dispara y devuelve 200 OK en ambos casos, el elemento se elimina en ambos casos también. Pero en el segundo caso, no se llama a la devolución de llamada.

¿Hay una diferencia significativa en REST? ¿Existe alguna forma de utilizar jQuery utilizando el controlador con scaffolded?


Esto a veces es causado por una versión anterior del complemento jQuery Validate. Si está utilizando este complemento, esto a veces lleva a este problema. Hay una actualización que corrige esto, si se aplica a su caso.

Alternativamente, probablemente pueda averiguar qué está pasando configurando un manejador de errores a través de:

$.ajaxSetup() o $.ajaxError()

Esto probablemente devolverá un error de análisis. Las versiones más recientes de jQuery son notorias por ser muy estrictas con respecto al análisis JSON.


GearHead es correcto, excepto que el analizador jQuery es lo suficientemente inteligente ahora para tratar una respuesta de cadena vacía como nula y no intentar analizarla.

Sin embargo, si tiene llamadas que a veces reciben json y algunas veces reciben una respuesta de la head , y usted no tiene acceso al servidor o no quiere cambiar todas sus llamadas principales, puede hacer esta solución alternativa:

El problema es que Rails envía un solo espacio como respuesta vacía cuando usas head (mira aquí: Cómo devolver el cuerpo realmente vacío en rieles, es decir, contenido-longitud 0 )

Las partes relevantes de la función jQuery parseJSON se ven así en el momento de escribir esto:

parseJSON: function( data ) { if ( typeof data !== "string" || !data ) { return null; } // Make sure leading/trailing whitespace is removed (IE can''t handle it) data = jQuery.trim( data ); // Attempt to parse using the native JSON parser first if ( window.JSON && window.JSON.parse ) { return window.JSON.parse( data ); }

Como puede ver, jQuery está probando si los datos son una cadena vacía antes de recortarla. Luego intenta con JSON.parse("") que puede ver en la consola, genera un error y desencadena la devolución de llamada de error ajax a través de una instrucción catch .

Hay una solución simple. jQuery le permite usar convertidores cuando se solicita un tipo de datos y se devuelve uno diferente. Vea aquí para más detalles: http://api.jquery.com/extending-ajax/

Como la respuesta de la head los rieles se representa como texto, simplemente puede definir un conversor de texto a json que recortará la respuesta antes de intentar analizarlo. Solo agrega este fragmento:

// deal with rails '' '' empty response jQuery.ajaxSetup({ converters: { "text json": function (response) { jQuery.parseJSON($.trim(response)) } } })


Me he topado con esto varias veces y la respuesta es engañosamente simple.

Está utilizando dataType : ''json'' en su llamada $ .ajax, por lo que jQuery espera una respuesta JSON. Con head :ok Rails devuelve una respuesta que contiene un único espacio ( http://github.com/rails/rails/issues/1742 ), que jQuery no acepta como JSON válido.

Entonces, si realmente espera obtener un error o un encabezado 200 OK, simplemente configure dataType : ''html'' en su solicitud y debería funcionar (si no establece dataType, jQuery intentará adivinar de qué tipo es basado en los encabezados de respuesta, etc., y todavía podría adivinar json, en cuyo caso todavía tendría este problema). Si realmente espera recuperar JSON, en lugar de utilizar head :ok render algo válido con JSON (ver comentarios) o simplemente use head :no_content como lo sugiere @Waseem