2012-08-11 12 views
11

Ho problemi a rispondere con JSON alla richiesta json, pur avendo abilitato il caching delle azioni.Rails action caching e json response

Ho un controller abbastanza semplice che risponde sia a JSON che a HTML e il caching funziona bene per la risposta HTML, ma ho notato quando richiedo JSON, e normalmente risponderebbe con JSON, ma con la cache d'azione abilitata, avvolge il JSON uscita nel layout!

Quando ho cancellato la cache, mi dà un errore che non esiste alcun layout di default:

ArgumentError in ClipsController N °

Non c'era layout predefinito per ClipsController in ...

Come restituire JSON per l'azione memorizzata nella cache?

UPDATE, ho il sospetto che l'errore circa layout ha a che fare con il modo in cui ho CACHE le azioni:

caches_action :index, :layout => false

Non sono sicuro, però, perché sarebbe ancora bisogno di un layout nel caso di una risposta JSON, poiché senza la memorizzazione nella cache non vi è alcun problema.

temporaneamente ho modificato il filtro della cache per non memorizzare la cache per le richieste JSON, ma questo non è un work-around ideale, cosa devo fare se voglio memorizzare nella cache JSON?

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

+3

Problema interessante! Ho passato un po 'di tempo a scavare su questo, e sembra essere un bug che è stato aggiunto in Rails 3 ... Non ho potuto farlo funzionare correttamente per me, ma http://blog.blazingcloud.net/2010/11/21/caching-in-rails/menzioni mettendo layout: false nel tuo before_filter, che potrebbe alleviare i tuoi problemi. Scusa non ho potuto aiutare di più. – sgrif

+0

Grazie. La tua soluzione alternativa ha fatto il trucco per la mia app Rails 3.2.8. Sto memorizzando nella cache le richieste JS nel browser ora, ho appena aggiunto response.headers ["Cache-Control"] = "max-age = 600, must-revalidate" sul controller e "cache: true" alla richiesta Jquery.Ajax. –

+1

Suppongo che tu abbia provato 'render json:' quando vuoi restituire specificamente JSON? – Raf

risposta

1

sembra che questo potrebbe effettivamente essere un bug con l'azione di caching, ma forse c'è qualcosa che non sto capendo.

Vedere this line per vedere dove va male. In sostanza, se hai impostato l'opzione di layout su false, non gli interessa e prova comunque a renderlo con un layout.

0

ho avuto un problema simile (il rendering HTML tramite una richiesta ajax, il layout è impostato su false, ma è presente)

Ecco una soluzione: creare un layout vuoto e usarlo per servire richiesta AJAX

# 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