2011-04-13 7 views
5

He estado experimentando un problema intermitente en mi aplicación Rails, y estoy teniendo problemas para averiguar qué está pasando. Cuando el usuario inicia sesión, ve un tablero que contiene algún código JavaScript que realiza una llamada AJAX a una acción. Ocasionalmente, en lugar de ver el tablero, cuando el usuario inicia sesión, ve el texto de respuesta JSON de la acción en lugar del panel de control (en Chrome) o descarga un archivo .json (Firefox). Es intermitente y no suele suceder, pero es realmente molesto cuando ocurre.El navegador a veces muestra texto JSON en lugar de la página deseada

Aquí hay una versión callados de una parte del código:

JS corriendo en la cabeza plantilla:

$(function() { 
    var remoteLink = $('#remoteLink'); 
    remoteLink.live("ajax:complete", function() { 
     setTimeout(function() { 
      loadCount(); 
     }, 30000); 
    });  

    loadCount(); 

    function loadCount() { 
     remoteLink.click(); 
    } 
}); 

Y el eslabón de la plantilla:

<%= link_to 'get count (hidden)', {:controller => 'something', :action => 'count'}, 
      :id => 'remoteLink', :class => 'hidden', :remote => true, 'data-type' => 'json' %> 

y el controlador acción:

def count 
    render :json => get_counts_function_returning_a_hash 
end 

Mi corazonada es que es una condición de carrera, ¿quizás relacionada con el uso de setTimeout? - pero no he podido verificar esa corazonada. ¿Alguien puede decirme qué podría estar pasando aquí? También he visto esto en la naturaleza en otros sitios, también intermitente, generalmente no ocurre, pero molesto cuando sucede.

Respuesta

4

¿Tiene algún código de autenticación que use store_location o una funcionalidad similar para redirigir al usuario a una página específica después de que haya iniciado sesión?

Una vez tuve un problema similar cuando la devolución de llamada AJAX estaba causando la ubicación de la tienda para almacenar la URL JSON y el usuario fue redirigido a la respuesta JSON en lugar de a su tablero de instrumentos. Esto fue difícil de rastrear porque el usuario tuvo que permanecer inactivo en la página durante un tiempo antes de que el error se manifestara.

En cualquier caso, sospecho que es algo así como un problema con Rails.

+0

Oh, muy interesante. No estamos usando store_location específicamente, pero tenemos nuestra propia implementación de algo similar. Investigaré y aceptaré esta respuesta si eso es lo que está sucediendo. – Jeff

+0

¡Tú ganas! Ese fue mi problema Estaba grabando la URL de solicitud de AJAX y reenviéndola al usuario después de iniciar sesión. Si el usuario cerró la sesión mientras el JS todavía estaba sondeando el servidor, y el usuario regresó a la página de inicio de sesión sin hacer clic en ningún otro enlace en la aplicación, este problema podría ocurrir. – Jeff

0

Sospecho el tipo de contenido de la respuesta HTTP y compruebo si hay posibles errores en los lugares donde lo está configurando. Ejecute su navegador con una extensión para rastrear encabezados HTTP para capturar cuáles son los valores cuando ocurre.

+0

Bueno, por lo que puedo observar, parece estar configurado correctamente (application/json). No lo estoy configurando manualmente en ninguna parte, creo que render: json debería ocuparse de eso, y veo Content-Type: application/json en las herramientas de desarrollo de Firebug y Chrome. Sin embargo, cuando recibo 304 Not Modified, no hay un encabezado Content-Type. Eso me parece bien, sin embargo, ya que creo que un 304 no debería tener ningún texto en el cuerpo. Lo que realmente veo, sin embargo, es un 304 que todavía contiene el cuerpo JSON. Quizás incluir este cuerpo no vacío en la respuesta 304 está causando un problema en ciertas situaciones? – Jeff

Cuestiones relacionadas