2012-08-11 7 views
11

Mam problemy z odpowiadaniem z JSON na żądanie Json, mając włączone buforowanie akcji.Buforowanie działań w szynach i odpowiedzi json

Mam dość prosty kontroler, który odpowiada zarówno na JSON, jak i na buforowanie HTML działa dobrze dla odpowiedzi HTML, ale zauważyłem, kiedy zażądałem JSON i normalnie odpowiedziałbym JSON, ale z włączoną pamięcią podręczną akcji, opakował JSON wyjście w układzie!

Kiedy wyczyszczone cache, to daje mi błąd, że nie Domyślny układ istnieje:

ArgumentError w ClipsController Wskaźnik

nie było domyślny układ dla ClipsController w ...

Jak mogę zwrócić JSON dla akcji z pamięci podręcznej?

UPDATE, podejrzewam błąd o układ ma do czynienia z okazji I buforować czynności:

caches_action :index, :layout => false

Nie jestem pewien jednak, dlaczego wciąż potrzebują układ w przypadku odpowiedź JSON, ponieważ bez buforowania nie ma problemu.

tymczasowo Zmodyfikowałem filtr pamięci podręcznej, aby nie buforował żądań JSON, ale nie jest to idealne obejście. Co mam zrobić, jeśli chcę buforować JSON?

caches_action :index, :layout => false, :if => Proc.new { |c| !c.request.format.json? }

+3

Interesujący problem! Spędziłem z tym trochę czasu i wygląda na to, że był to błąd, który został dodany w Railsach 3 ... Nie mogłem tego sprawić, żeby działał poprawnie, ale http://blog.blazingcloud.net/2010/11/21/caching-in-rails/wzmianki o umieszczeniu layoutu: false w twoim pliku before_filter, co może złagodzić twoje problemy. Przepraszam, nie mogłem pomóc więcej. – sgrif

+0

Dziękuję. Twoje obejście zmywało moją aplikację Rails 3.2.8. Teraz buforuję żądania JS w przeglądarce, dodałem response.headers ["Cache-Control"] = "max-age = 600, must-revalidate" na kontrolerze i "cache: true" na żądanie Jquery.Ajax. –

+1

Przypuszczam, że próbowałeś 'renderować json:' kiedy chcesz zwrócić JSON? – Raf

Odpowiedz

1

Wygląda to rzeczywiście może być błąd z buforowania akcji, ale być może jest coś nie mam zrozumienia.

Zobacz, gdzie się nie udać. Zobacz this line. Zasadniczo, jeśli ustawiłeś opcję układu na false, to nie ma to znaczenia i mimo to próbuje renderować ją z układem.

0

mam podobny problem (renderowania HTML poprzez ajax żądanie, układ jest ustawiony na false, ale jest obecny)

Oto obejście: utworzyć pusty układ i użyć go do służyć Ajax zażądania

# app/views/layout/empty.html.erb 
<%= yield %> 

# controller 
class FooController ... 
    layout Proc.new { |controller| controller.request.xhr? ? "empty" : "your normal html layout" } 
    caches_action ... 
end