Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

368
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!