2010-02-26 14 views
10

Estoy bastante seguro de que puedo almacenar en caché de página la gran mayoría de mi sitio, pero una cosa que me impide hacerlo es que mis mensajes flash no se mostrarán, o se mostrarán en el error hora.Caché de página de raíles y mensajes flash

Una cosa que estoy considerando es escribir el mensaje flash en una cookie, leerlo y mostrarlo a través de javascript y borrar la cookie una vez que se haya mostrado el mensaje. ¿Alguien ha tenido éxito al hacer esto o hay mejores métodos?

Gracias.

Respuesta

2

Una solución sería almacenar en caché la página, pero incluya un fragmento de javascript que hará otra pequeña solicitud solo para la sección que desea que sea dinámica. Por lo tanto, el usuario descargará la página completamente y luego, cuando se ejecute javascript, desplegará el elemento dinámico de la página.

Escribí una breve publicación en el blog sobre esto hace un tiempo. http://chase.ratchetsoftware.com/2008/12/rails-caching-dynamic-fragments/

Además, Greg Pollack de RailsEnvy realizó un screencast donde se centra en tener datos dinámicos en las páginas almacenadas en caché. http://railslab.newrelic.com/2009/02/05/episode-5-advanced-page-caching

Espero que esto ayude,

de Chase Grey

+0

Me gusta esta idea. Parece que podría ser el boleto. – KJF

+1

Creo que vale la pena señalar que esto no aprovechará todos los beneficios del almacenamiento en caché de la página, ya que el proceso de Rails seguirá siendo golpeado cada vez en lugar de no hacerlo en absoluto. Sin embargo, no puedo pensar en una mejor solución. –

+3

El almacenamiento en caché de fragmentos es mejor que servir una segunda solicitud HTTP que solo solicita datos que podrían incluirse en el primero. Esta estrategia duplicaría la cantidad de solicitudes HTTP que usted presta. –

0

No tiene que almacenar toda la página en caché. Intente almacenar en caché los fragmentos API

+0

¿Quizás quiere almacenar en caché toda la página? El almacenamiento en caché de páginas brinda el mayor impulso al rendimiento. –

+0

Sí, correcto. Ya estoy fragmentando el almacenamiento en caché para eludir el problema del flash. – KJF

4

estoy tratando con el mismo problema y me encontré con cacheable-flash plugin que hace exactamente lo KJF describe en la pregunta.

Creo que esta es la solución más simple y más agradable que hacer excesivas llamadas ajax.

+0

Creo que este es el mejor enfoque para Rails. La mayoría de las otras respuestas a esta pregunta sugieren construir la suya propia, pero la gema de memoria caché se resuelve y la resuelve bien. Gracias Anton y Pivotal Labs. – GregT

-1

No consumo rieles pero esto es cómo lo hice en Python usando los UUID:

# set flash messages like this 
def flash(self, title, body): 
    session['flash_messages'].append({ 
    'title': title, 
    'body': body, 
    'uuid': uuid().hex # stores a UUID as a string 
    }) 

... 

self.flash('foo', 'bar') 

Luego, en la plantilla base tengo esto:

<script type="text/javascript"> 
    {% for m in session.flash_messages %} 
    if(!Cookies.get('{{m.uuid}}')) { 
     Notify('{{m.title}}', '{{m.body}}'); 
     Cookie.set('{{m.uuid}}', 'true', 86400); // key, value, expiry seconds 
    } 
    {% endfor %} 
</script> 

Me vas a romper abajo para desafiado-Pythonically:

  1. al agregar un mensaje flash, se crea un identificador único y lo almacenan con ese mensaje.
  2. Antes de mostrar el mensaje, verifica si se ha configurado una cookie con el ID único del mensaje.
  3. Si esa cookie no se ha configurado, muestre el mensaje y configure la cookie. Vende la galleta en un día, o tan breve como creas que es prudente.

Ahora, si esta página se extrae de la memoria caché, estará bien. En el paso 2, la prueba de la cookie pasará porque ya se ha configurado y el mensaje no se mostrará.

7

cacheable flash de hacer esto:

en su controlador de aplicación:

after_filter :write_flash_to_cookie 


def write_flash_to_cookie 
    cookie_flash = cookies['flash'] ? JSON.parse(cookies['flash']) : {} 

    flash.each do |key, value| 
     if cookie_flash[key.to_s].blank? 
      cookie_flash[key.to_s] = value 
     else 
      cookie_flash[key.to_s] << "<br/>#{value}" 
     end 
    end 

    cookies['flash'] = cookie_flash.to_json 
    flash.clear 
end 

y luego leer cookie "flash" a través de Javascript e inserte el mensaje dentro

0

vieja pregunta el código HTML ... pero lo solucioné al incluir el mensaje flash en mi clave de caché.

caches_action :show, cache_path: proc { |c| 
    most_recent_update_time = MyClass.order('updated_at DESC').limit(1).first.try(:updated_at).to_i 
    { tag: most_recent_update_time.to_s + c.flash.collect{|x| x}.join } 
} 

si tiene mensajes flash en su acción show esto obviamente romper el caché a menudo, pero funciona bien si usted no está haciendo una gran cantidad de mensajes.

0

Unobtrusive Flash coloca el mensaje flash en una cookie y lo muestra mediante JavaScript. Proporciona lógica de visualización JS con sabor a vainilla y Bootstrap. Funciona en solicitudes normales y ajax. También es fácil conectar marcos como AngularJS.

Cuestiones relacionadas