Sweep!
キャッシュ解放の命令をコントローラに直接書きたくないんだ!
# app/top_controller.rb
caches_page :index
# app/posts_controller.rb
cache_sweeper :post_sweeper
# app/sweepers/post_sweeper.rb
class PostSweeper < ActionController::Caching::Sweeper
observe Post
def after_create(post)
expire_public_page
end
def after_update(post)
expire_public_page
end
def after_destroy(post)
expire_public_page
end
private
def expire_public_page
expire_page :controller => 'top', :action => 'index'
end
end
上記の用に、ActiveRecordを監視して、キャッシュをお掃除するという感じです。コントローラのcreate/update/destroyに埋め込むより、素早くどこでキャッシュを解放しているかが分かるのでいいですね。
キャッシュがpublic/index.htmlだったりする件について
キャッシュがうまく消えなかったあの頃、ビューファイルをいじっても反映されず、development.rbのキャッシュを無効にする設定をやっても反映されず... どうしたんだぁヘヘイベイベー!と清志郎の歌を歌いながらgit statusしてみたら、public/index.htmlが復活していた!
これはパフォーマンス上はいいと思うんだけど、認証が前提のグループウェアとかの場合って、静的ファイルになっちゃうと困る部分がありますよね。ここら辺はどうするんだろう。きっとうまいやり方があるんだろうな。そのうち必要になったら調べよう
追記: Railsのキャッシュの種類
調べました。Railsには、
- ページキャッシュ
- アクションキャッシュ
- フラグメントキャッシュ
の3タイプのキャッシュがあって、今回のページキャッシュは静的ファイルを生成するものでした。残りの2つのキャッシュについては近い将来絶対に利用すると思うので、その時にまとめられたらいいなと思ってます。