Fragment caching e action caching
L'action caching è sostanzialmente identico al page caching, ma le richieste vengono ancora fatte passare attraverso il controller, il che fa si che ad esse possano essere applicati filtri ed altro. Il meccanismo d'uso è pero praticamente immutato, semplicemente si userà caches_action
nei controller, e negli sweeper si potrà usare expire_action
. Il controller HomeController
, ad esempio, può far uso di un comodo caching di questo tipo:
caches_action :index, :add_topic, :show
Ovviamente, per gestire l'invalidazione della cache dovremo far uso di nuove regole di sweeping, creando una nuova classe TopicSweeper
ex novo o aggiungendo delle regole allo sweeper esistente, e facendo si che sia controllata anche la classe Topic. Se scegliamo di gestire diverse classi in un unico sweeper, dovremo stare attenti alla gestione delle callback, in quanto l'oggetto potrà essere di qualsiasi tipo, e quindi dovremo usare una cosa come questa:
def after_save(thing)
case thing
when Topic
expire_action :controller=>'home',:action=>'index'
when Message
expire_action :controller=>'home', :action=>'show', :id=>thing.topic.id
end
end
Il codice dovrebbe essere autoesplicativo, ma possiamo vedere una cosa interessante nella gestione relativa al caso in cui venga creato un nuovo messaggio: poiché il caching è relativo ad una azione con un parametro specifico, l'identificativo del topic, utilizziamo l'informazione salvata nel messaggio per costruire un url specifico, in modo da invalidare la cache soltanto per quell'oggetto.
L'ultimo tipo di caching è il caching dei fragment, frammenti, ed è quello pensato per gestire pezzetti statici all'interno di pagine dinamiche, sostanzialmente è necessario soltanto usare il metodo cache
, ed un blocco:
<%= codice variabile %>
<% cache(:action=>"azione", :parametro=>"qualcosa") do %>
<p> codice statico </p>
<% end %>
Per cancellare i dati possiamo utilizzare expire_fragment(:controller=>"mycontroller", :action=>"azione", :parametro=>"qualcosa")
, se non utilizziamo argomenti per il metodo cache
il frammento verrà associato univocamente alla coppia controller/azione. Il fragment caching permette di raggiungere una flessibilità estrema, ed in effetti l'action caching è implementato usando i frammenti, ma ovviamente è quello che offre il minore incremento prestazionale, quindi utilizzatelo solo quando gli altri metodi non sono possibili.
L'ultima cosa da dire sul page caching è che esso di default funziona solamente in modalità production
, quindi se sperimentando con la nostra applicazione di prova vi sembra che non funzioni provate ad eseguire script/server
con l'opzione "-e production
", o altrimenti intervenite nel file config/environments/development.rb cambiando il valore della linea
config.action_controller.perform_caching = false
da false
a true
.