2012-05-23 40 views
5

Antes de nada: $.getJSON back button showing JSON return data not the page no fue de ayuda, como tampoco https://groups.google.com/group/angular/browse_thread/thread/3787ad609c0beb77/eb1b57069dab9f63 no lo hizo y Internet tampoco ayudó.Botón JSON para volver atrás en Chrome, Botón para volver a cargar en IE (se muestra como información desnuda)

Aquí está el problema:

Voy a llamar a una URL desde dentro de una página para obtener los datos JSON, que luego se rindió con la plantilla jQuery dentro de esta misma página.

Imaginemos que estamos en la página http://someurl.com/search y estamos empezando una petición como esta

$.ajax({ 
    url: '/searchthis', //important, this is NOT THE SAME URL 
    cache: false, 
    type: 'GET', 
    headers: { 
    "Accept": "application/json", 
    }, 
    dataType: 'json' 
    success: function(data) { 
    doSomethingWithResults(data); 
    } 
}); 

La respuesta rack tiene la cabecera de control de caché se establece a no caché:

Cache-Control:no-cache 

todo funciona bien, pero si deja la página para otra página en Chrome y luego presiona el botón Atrás, se le mostrarán datos JSON desnudos. El mismo comportamiento existe cuando presionas el botón de recarga en IE8. Ambos funcionan perfectamente bien si solo presionas Enter en la url en la barra de direcciones.

ahora no recibo cómo podría solucionar este problema, ya que los chicos Chrome no lo harán (ver http://code.google.com/p/chromium/issues/detail?id=108425)

Me parece como una mala interpretación en el lado de los navegadores, ya que almacena algo que realmente debería no (encabezado de respuesta) y almacena en caché algo bajo una URL incorrecta (porque la solicitud JSON no golpea la misma URL)

Respuesta

6

El problema era en realidad Rieles: tanto Chrome como IE solicitan la última respuesta sin formato específico, por lo que Rails solo toma el primer bloque de respuesta, que resultó ser JSON en mi caso. Poner el bloque html en frente del bloque json resolvió el problema.

respond_to do |format| 
    format.html { ... } //important because the request comes with no specific format 
    format.json { ... } 
end 
3

Tuve el mismo problema con Chrome. Método de mi controlador tiene la format.html

respond_to do |format| 
    format.html 
    format.js 
end 

Parece que Chrome almacena en caché los resultados, así que fue capaz de solucionar este problema mediante la adición de una entrada de datos a mi petición Ajax, así:

$.ajax({ 
    url: '/restful/path', 
    data: { format: 'js' }, // This line here 
    dataType: 'json' 
}); 

o puede pasar el formato de su anexión a la final de la petición, sólo asegúrese de que usted tiene la opción de (.:format) en su ruta

$.ajax({ 
    url: '/restful/path.js', 
    dataType: 'json' 
}); 

esperanza que esta lps alguien

+0

Me encontré con problemas similares en una aplicación express. Parece pasar incluso un objeto vacío, ya que el valor de los datos hará el truco. Gracias por publicar esto. – kdetella

+0

De hecho, lo resolvió con el envío de un formato en los datos. Usé 'json', así:' $ .getJSON (ruta, {formato: "json"}, handler_func (respuesta) {// hacer algo}) 'para que funcione – Glenn

Cuestiones relacionadas