2012-05-23 14 views
5

Przed wszystkim: $.getJSON back button showing JSON return data not the page nie pomógł, podobnie jak https://groups.google.com/group/angular/browse_thread/thread/3787ad609c0beb77/eb1b57069dab9f63, a Internet również nie pomógł.Przycisk przerwania JSON w przeglądarce Chrome, przycisk Załaduj ponownie w IE (pokazany jako nagie dane)

Oto problem:

Dzwonię url z poziomu strony, aby uzyskać dane json, które następnie pobiera renderowane z jQuery szablonów wewnątrz tej samej stronie.

Wyobraźmy sobie, że jesteśmy na stronie http://someurl.com/search i zaczynamy wniosek jak ten

$.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); 
    } 
}); 

Odpowiedź Rack ma nagłówek sterowania cache ustawiona na no cache:

Cache-Control:no-cache 

wszystko działa dobrze, ale jeśli opuścisz stronę dla innej strony w Chrome, a następnie naciśniesz przycisk Wstecz, otrzymasz pokazane nagie dane JSON. To samo zachowanie występuje po naciśnięciu przycisku ładowania w IE8. Oba działają doskonale, jeśli po prostu naciśniesz Enter w adresie URL na pasku adresu.

ja nie dostaję, jak mogę rozwiązać ten problem, bo chłopaki Chrome nie zrobi (patrz http://code.google.com/p/chromium/issues/detail?id=108425)

Wydaje mi się błędnej interpretacji po stronie przeglądarki, ponieważ buforuje coś naprawdę powinno not (nagłówek odpowiedzi) i buforuje coś pod niewłaściwym adresem URL (ponieważ żądanie JSON nie trafia pod ten sam adres URL)

Odpowiedz

6

Problem polegał faktycznie na Railsach: zarówno Chrome, jak i IE zażądały ostatniej odpowiedzi bez konkretnego formatu, więc Railsy właśnie bierze pierwszy blok odpowiedzi, który w moim przypadku był jsonem. Umieszczenie bloku html przed blokiem json rozwiązało problem.

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

Miałem ten sam problem z Chrome. Metoda mojego kontrolera nie mają format.html

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

Wydaje się, że Chrome buforuje rezultaty, więc udało mi się rozwiązać ten problem poprzez dodanie wprowadzania danych do mojego żądania ajax, tak:

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

lub może przejść format poprzez dołączenie go do końca życzenie, po prostu upewnij się, że mają możliwość (.:format) w trasie

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

nadzieję, że to on lps someone

+0

Występowałem z podobnymi problemami w aplikacji ekspresowej. Wydaje się, że przekazuje nawet pusty obiekt, ponieważ wartość danych wystarczy. Dzięki za zamieszczenie tego. – kdetella

+0

Naprawiono to, wysyłając format do danych. Użyłem 'json', tak jak:' $ .getJSON (ścieżka, {format: "json"}, handler_func (odpowiedź) {// coś}), aby uruchomić – Glenn

Powiązane problemy