Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

261
Vistas
jquery no llama al método de éxito en $ .ajax para la respuesta REST DELETE estándar de Rails

Puede ser que ese problema no sea 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); } });

Mi controlador Rails se ve así:

 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 (como se genera por 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 rails 3.0.3 , jQuery 1.4.2 y Firefox 3.6.13 .
Firebug dice que la consulta se activa y devuelve 200 OK en ambos casos, el elemento también se elimina en ambos casos. Pero en el segundo caso, no se llama a la devolución de llamada.

¿Hay una diferencia significativa en REST y hay alguna manera de utilizar jQuery usando el controlador con andamios?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Me he encontrado 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 solo 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 configura dataType, jQuery intentará adivinar cuál es el tipo basado en encabezados de respuesta, etc., y aún podría adivinar json, en cuyo caso aún tendría este problema). Si realmente espera recuperar JSON, en lugar de usar head :ok renderice algo válido con JSON (ver comentarios) o simplemente use head :no_content como lo sugiere @Waseem

over 4 years ago · Santiago Trujillo Denunciar

0

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 otras veces reciben una respuesta head , y no tiene acceso al servidor o no desea cambiar todas sus llamadas head , puede hacer esta solución alternativa:

El problema es que Rails envía un solo espacio como respuesta vacía cuando usa head (vea aquí: ¿Cómo devolver un cuerpo verdaderamente vacío en Rails? Es decir, content-length 0 )

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

 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 recortarlos. Luego intenta JSON.parse("") que puede ver en su consola da como resultado un error, lo que activa la devolución de llamada de error ajax a través de una declaración de catch .

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

Dado que la respuesta head de Rails se representa como texto, simplemente puede definir un convertidor de texto a json que recortará la respuesta antes de intentar analizarla. Simplemente agregue este fragmento:

 // deal with rails ' ' empty response jQuery.ajaxSetup({ converters: { "text json": function (response) { jQuery.parseJSON($.trim(response)) } } })
over 4 years ago · Santiago Trujillo Denunciar

0

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

Alternativamente, probablemente puedas averiguar qué es lo que va mal configurando un controlador de errores a través de:

$.ajaxSetup() o $.ajaxError()

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

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda