Rails: problemi caching e sweeper tra più controllers

Salve a tutti,

sto affrontando il caching con la mia applicazione, per farla breve, ho
2 controller che si occupano di gestire un modello Page, il primo
amministra (CRUD) le pagine (/admin/pages/), l’altro viene usato per
la sola fruizione (/pages/).

naturalmente, mi interessa il caching in fruizione, quindi nel
controller di fruizione (PagesController) ho messo questo (ho solo
questa action):
caches_action :show

in quello di amministrazione (Admin::PagesController), invece, c’è lo
sweeper:
cache_sweeper :page_sweeper, :only => [:update, :destroy]

a sua volta, lo sweeper (page_sweeper.rb) è definito in questo modo:
class PageSweeper < ActionController::Caching::Sweeper
observe Page

def after_update(page)
expire_action(:controller => :pages, :action => :show, :id =>
page.id)
logger.info(“aggiornamento cache…”)
end

def after_destroy(page)
expire_action(:controller => :pages, :action => :show, :id =>
page.id)
end
end

fin qui tutto ok, ho attivato il caching ed ho lanciato il server, la
prima chiamata ad una pagina genera la relativa cache. dai log e dal
filesystem ho la certezza che il caching funziona.

il problema lo incontro quando modifico una pagina, in questo caso la
cache non viene cancellata perchè quando ricarico la pagina in fruizione
continuo a vedere la vecchia cache :-/

lo sweeper viene chiamato di sicuro, perchè compare il mio messaggio nei
log, ma il risultato non cambia.

qualcuno di voi saprebbe dirmi come risolvere? giusto per completezza,
uso rails 2.3.3

grazie in anticipo :wink:
A.

mi rispondo da solo :stuck_out_tongue:

sono riuscito a risolvere, dopo aver trovato l’unico thread con un
problema simile al mio :stuck_out_tongue:
a quanto pare expire_action fa riferimento al controller che ha generato
la modifica sul modello, quindi non trovando alcuna cache nel controller
di amministrazione, non c’è nessuna cache da eliminare.

l’unico modo è specificare il controller esplicitamente, così ho
modificato PageSweeper:

class PageSweeper < ActionController::Caching::Sweeper
observe Page

def after_update(page)
expire_action(url_for(page))
end

def after_destroy(page)
expire_action(url_for(page))
end
end

a quanto pare con url_for(page) riesce a capire che il controller è
PagesController e non Admin::PagesController

spero torni utile in caso qualcuno dovesse incontrare problema simile al
mio :wink:

un saluto,
A.

Andrea P. ha scritto:

Ciao Simone, grazie per per la risposta :slight_smile:

il thread che avevo letto in rete parlava proprio della tua spiegazione.
tuttavia, non ho capito perchè, usando:

expire_action(:controller => “/pages”, :action => :show, :id => page.id)

continuava a non funzionare, eppure usando url_for(page), che alla fine
restituisce lo stesso percorso alla risorsa, è andato senza problemi :slight_smile:

ciao di nuovo :wink:
A.

Simone C. ha scritto:

controller che ha eseguito l’azione

expire_action(:controller => “pages”, :action => :show, :id => page.id)

controller PagesController

expire_action(:controller => “/pages”, :action => :show, :id => page.id)

controller Admin::PagesController

expire_action(:controller => “admin/pages”, :action => :show, :id =>
page.id
)

2009/9/20 Andrea P. [email protected]

sono riuscito a risolvere, dopo aver trovato l’unico thread con un
problema simile al mio :stuck_out_tongue:
a quanto pare expire_action fa riferimento al controller che ha generato
la modifica sul modello, quindi non trovando alcuna cache nel controller
di amministrazione, non c’è nessuna cache da eliminare.

l’unico modo è specificare il controller esplicitamente, così ho
modificato PageSweeper:


Simone C.

Site & Blog: http://www.simonecarletti.com
Email: [email protected]
LinkedIn: http://linkedin.com/in/weppos
Nick: weppos | Skype: weppos