2010-02-26 11 views
10

Sono abbastanza sicuro di poter archiviare nella cache la maggior parte del mio sito ma l'unica cosa che mi impedisce di farlo è che i miei messaggi flash non verranno visualizzati, o verranno visualizzati in modo errato tempo.Cache di pagine di rails e messaggi flash

Una cosa che sto considerando è scrivere il messaggio flash su un cookie, leggerlo e visualizzarlo tramite javascript e cancellare il cookie una volta che il messaggio è stato visualizzato. Qualcuno ha avuto successo o ci sono metodi migliori?

Grazie.

risposta

2

Una soluzione sarebbe quella di memorizzare nella cache la pagina, ma includere uno snippet javascript che farà un'altra piccola richiesta solo per la sezione che desideri sia dinamica. Quindi l'utente scaricherà la pagina completamente, e quindi quando javascript verrà eseguito, verrà visualizzato l'elemento di pagina dinamico.

Ho scritto un breve post sul blog su questo un po 'di tempo fa. http://chase.ratchetsoftware.com/2008/12/rails-caching-dynamic-fragments/

Inoltre, Greg Pollack di RailsEnvy ha fatto uno screencast in cui si concentra sull'avere dati dinamici nelle pagine memorizzate nella cache. http://railslab.newrelic.com/2009/02/05/episode-5-advanced-page-caching

Spero che questo aiuti,

Chase Grey

+0

Mi piace questa idea. Sembra che potrebbe essere il biglietto. – KJF

+1

Penso che valga la pena notare che questo non realizzerà tutti i vantaggi del caching delle pagine, perché il processo Rails sarà comunque colpito ogni volta invece che non del tutto. Non riesco a pensare ad una soluzione migliore però. –

+3

Il caching dei frammenti è meglio che servire una seconda richiesta HTTP che richiede solo dati che potrebbero essere inclusi nel primo. Questa strategia raddoppierà il numero di richieste HTTP che servi. –

0

Non è necessario memorizzare nella cache l'intera pagina. Prova la cache dei frammenti API

+0

Forse vuole mettere in cache l'intera pagina? Il caching delle pagine offre il maggiore incremento delle prestazioni. –

+0

Sì, corretto. Al momento sono già in fase di frammentazione per aggirare il problema del flash. – KJF

4

ho a che fare con lo stesso problema e ho trovato cacheable-flash plugin che fa esattamente quello che KJF descritto nella domanda.

Penso che questa sia una soluzione più semplice e migliore rispetto a effettuare chiamate ajax eccessive.

+0

Penso che questo sia l'approccio migliore per Rails. La maggior parte delle altre risposte a questa domanda suggeriscono di crearne di nuove, ma la gemma del cache memorizzabile già risolve questo problema e risolve il problema. Grazie Anton e Pivotal Labs. – GregT

-1

Non faccio uso di Rails, ma questo è come ho fatto in Python usando 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') 

Poi nel modello di base ho questo:

<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> 

ti rompo esso down the Pythonically challenge:

  1. Quando si aggiunge un messaggio flash, si crea un ID univoco e lo si memorizza con quel messaggio.
  2. Prima di visualizzare il messaggio, si controlla se è stato impostato un cookie denominato con ID univoco del messaggio.
  3. Se il cookie non è stato impostato, inviare il messaggio e impostare il cookie. Scadere il cookie in un giorno o breve come pensi sia saggio.

Ora se questa pagina viene estratta dalla cache, andrà bene. Al passaggio 2 il test per il cookie passerà perché è già stato impostato e il messaggio non verrà visualizzato.

7

Cacheable Flash fare questo:

nel controller dell'applicazione:

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 

e poi leggere cookie "flash" tramite Javascript e inserire il messaggio all'interno

0

vecchia questione del codice HTML ... ma ho aggirato questo includendo il messaggio flash nella mia chiave di cache.

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 } 
} 

se si dispone di messaggi flash sul vostro show azione questo sarà ovviamente romperà la cache spesso, ma funziona bene se non stai facendo un sacco di messaggi.

0

Unobtrusive Flash inserisce il messaggio flash nel cookie e lo visualizza tramite JavaScript. Fornisce logiche di visualizzazione JS aromatizzate con vaniglia e Bootstrap. Funziona in normali richieste Ajax. È anche facile collegarsi a framework come AngularJS.

Problemi correlati