shadowmaru.org

Vai tomar café

Limpando o cache de outros models no Rails

by Ricardo Yasuda on April 22, 2009 20:50

Posted in Rails, Ruby

Photo:Ange Soleil (a.k.a Tweng)

Frequentemente fazemos Page Cache na DBurns, para melhorar a performance das nossas aplicações. Um dos problemas que temos enfrentado nos últimos projetos é limpar o cache de outros models, quando modificamos alguma página no nosso CMS, principalmente quando temos um submenu dinâmico, com as filhas de uma página.

Digamos que temos um model Page e um model NewsArticle. Quando alteramos alguma coisa no Page queremos limpar o cache, através de um sweeper, tanto de Page como de NewsArticle.

Todas as soluções que encontramos, entre elas o tutorial de cache do Rails Envy, diziam para mudar o diretório de cache e apagá-lo por inteiro. Veja no tutorial mais detalhes de como fazer isso.

Só que o problema é que tanto o Mongrel quanto o Apache não sabem ler o cache se não for o padrão (em /public). Então você precisaria fazer um patch no Mongrel e uma mudança no httpd.conf do Apache:

RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/$ /cache/index.html [QSA,L]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f
RewriteRule ^/(.*)$ /cache/$1.html [QSA,L]

OK, fácil, mas nem sempre temos acesso às configurações do Apache em produção, e por .htaccess não funciona, já tentamos. Para não depender do servidor onde fazemos deploy, a solução foi usar o mesmo procedimento (apagar o diretório inteiro), só que usando o diretório padrão de cache.

Fiz isso, daí o Marcio Trindade deu a idéia de transformar em um método e colocar numa lib, adicionando o método ao ActionController::Caching::Sweeper. Daí poderíamos aproveitar para outros sweepers. Foi o que eu fiz, colocando o arquivo em config/initializers:

E o sweeper ficou:

Tags: rails, sweeper, cache, initializer, clear

You may also like:

Tweetbacks

Tweet this post

    Comments

    Write a comment

    Google Analytics Alternative