# Rails: problemi caching e sweeper tra piÃ¹ controllers

**URL:** <https://www.ruby-forum.com/t/rails-problemi-caching-e-sweeper-tra-pia-controllers/175815>\
**Category:** IT\
**Created:** [September 20, 2009, 3:16pm UTC](https://www.ruby-forum.com/t/rails-problemi-caching-e-sweeper-tra-pia-controllers/175815 "2009-09-20T15:16:03Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [September 20, 2009, 3:16pm UTC](https://www.ruby-forum.com/t/rails-problemi-caching-e-sweeper-tra-pia-controllers/175815/1 "2009-09-20T15:16:03Z")

</div>

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 😉  
A.

---

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [September 20, 2009, 5:50pm UTC](https://www.ruby-forum.com/t/rails-problemi-caching-e-sweeper-tra-pia-controllers/175815/2 "2009-09-20T17:50:36Z")

</div>

mi rispondo da solo 😛

sono riuscito a risolvere, dopo aver trovato l’unico thread con un  
problema simile al mio 😛  
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 😉

un saluto,  
A.

Andrea P. ha scritto:

---

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [September 21, 2009, 10:01am UTC](https://www.ruby-forum.com/t/rails-problemi-caching-e-sweeper-tra-pia-controllers/175815/3 "2009-09-21T10:01:42Z")

</div>

Ciao Simone, grazie per per la risposta 🙂

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 🙂

ciao di nuovo 😉  
A.

Simone C. ha scritto:

---

<div class="post-metadata">

**Author:** ![stanley](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/s/7ab992/32.png) [@stanley](https://www.ruby-forum.com/u/stanley)\
**Post date:** [September 20, 2009, 5:56pm UTC](https://www.ruby-forum.com/t/rails-problemi-caching-e-sweeper-tra-pia-controllers/175815/4 "2009-09-20T17:56:27Z")

</div>

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. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> sono riuscito a risolvere, dopo aver trovato l’unico thread con un  
> problema simile al mio 😛  
> 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](http://www.simonecarletti.com)  
Email: [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
LinkedIn: [http://linkedin.com/in/weppos](http://linkedin.com/in/weppos)  
Nick: weppos | Skype: weppos
