2012-08-11 16 views
11

Tengo problemas para responder con JSON a la solicitud json, mientras tengo habilitado el almacenamiento en caché de acciones.Caché de acciones de Rails y respuestas json

Tengo un controlador bastante simple que responde tanto a JSON como a HTML y el almacenamiento en caché funciona bien para la respuesta HTML, pero me di cuenta cuando solicito JSON y normalmente respondo con JSON, pero con la caché activa habilitada, ajusta el JSON salida en el diseño!

Cuando borra la cache, me da un error que no existe ninguna disposición por defecto:

ArgumentError en ClipsController N.º

No hubo diseño predeterminado para ClipsController en ...

¿Cómo devuelvo JSON para la acción en caché?

UPDATE, sospecho que el error sobre el diseño tiene que ver con la forma en cacheamos las acciones:

caches_action :index, :layout => false

No estoy seguro sin embargo, ¿por qué todavía tendría un diseño en el caso de una respuesta JSON, ya que sin almacenamiento en caché no hay problema.

temporalmente he modificado el filtro de caché para no almacenar en caché las solicitudes JSON, pero esto no es una solución ideal, ¿qué hago si quiero almacenar en caché JSON?

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

+3

¡Problema interesante! He pasado un tiempo investigando esto, y parece ser un error que se agregó en Rails 3 ... No pude hacer que esto funcionara correctamente para mí, pero http://blog.blazingcloud.net/2010/11/21/caching-in-rails/mentions poniendo layout: falso en su before_filter, lo que podría aliviar sus problemas. Lo siento, no pude ayudar más. – sgrif

+0

Gracias. Su solución hizo el truco para mi aplicación Rails 3.2.8. Estoy almacenando en caché las solicitudes JS en el navegador ahora, solo agregué response.headers ["Cache-Control"] = "max-age = 600, debe-revalidar" en el controlador y "cache: true" en la solicitud de Jquery.Ajax. –

+1

Supongo que ha intentado 'render json:' cuando desea devolver específicamente JSON? – Raf

Respuesta

1

parece que esto en realidad podría ser un error con el almacenamiento en caché de acción, pero tal vez hay algo que no estoy entendiendo.

Consulte this line para ver dónde sale mal. Básicamente, si ha configurado la opción de diseño en falso, no le importa, e intenta renderizarlo con un diseño de todos modos.

0

tengo un problema similar (renderizado HTML a través de una petición AJAX, la disposición se establece en false, pero está presente)

Aquí hay una solución: crear una composición vacía y lo utilizan para servir a petición 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 
Cuestiones relacionadas