🦓
[Rails]ページキャッシュ
はじめに
Railsのページキャッシュは、ページをHTMLファイルとして保存し、再リクエスト時にWebサーバーを経由せずキャッシュストアからそれを提供する仕組みです。
動的なコンテンツやユーザー固有の情報を含むページには適さないので今回は静的なトップページを作ってキャッシュしてみたいと思います。
Rails4からページキャッシュ機能をgem化されたのでactionpack-page_caching
を使います。
ドキュメントを参考しながら進めていきます。
流れ
- gemをインストールする
- キャッシュを
ON
にする - トップページを作成する
- トップページをキャッシュする
- キャッシュの破棄
gemをインストールする
Gemfile
gem "actionpack-page_caching"
bundle install
キャッシュを有効にする
config/environments/production.rb
config.action_controller.perform_caching = true
development
環境ではbin/rails dev:cache
を実行することができます。
bin/rails dev:cache
Development mode is now being cached.
bin/rails dev:cache
Development mode is no longer being cached.
キャッシュディレクトリ
キャッシュディレクトリはデフォルトでpublic/
ディレクトリの下に作成されます。
Postsコントローラーのindex
ページの場合public/posts/index
内にキャッシュが保存されます。
無い場合railsが作成するので事前に作成する必要がないです。
ディレクトリを変えたい場合デフォルトのパスを上書きすることができます。
# 環境設定のファイルに追加
config.action_controller.page_cache_directory = Rails.root.join("public", "cached_pages")
トップページを作成する
bin/rails g controller pages top
create app/controllers/pages_controller.rb
create app/views/pages
create app/views/pages/top.html.erb
routes.rb
に追加します。
config/routes.rb
Rails.application.routes.draw do
# Defines the root path route ("/")
root "pages#top"
end
トップページをキャッシュする
キャッシュの有効期間を一時間に設定しました。
app/controllers/pages_controller.rb
class PagesController < ApplicationController
+ caches_page :top, expires_in: 1.hour
def top
end
end
expires_in
ヘルパーメソッドを使って有効期間を設定することができます。
サーバーを再起動しディレクトリが作成されたことを確認します。
キャッシュファイルを一時間後に削除されます。
ページをリロードしてログにGET
リクエストを実行されないことを確認します。
また、top.index.html
を編集し、ページを再リロードしても変化を反映されないとこを確認します。
キャッシュを破棄する
expire_page
ヘルパーメソッドを使います。
app/controllers/pages_controller.rb
expire_page :controller => "pages", :action => "top"
終わりに
ページキャッシュを試してみました。
Discussion