🦓

[Rails]ページキャッシュ

2023/09/12に公開

はじめに

Railsのページキャッシュは、ページをHTMLファイルとして保存し、再リクエスト時にWebサーバーを経由せずキャッシュストアからそれを提供する仕組みです。

動的なコンテンツやユーザー固有の情報を含むページには適さないので今回は静的なトップページを作ってキャッシュしてみたいと思います。

https://railsguides.jp/caching_with_rails.html#ページキャッシュ

Rails4からページキャッシュ機能をgem化されたのでactionpack-page_cachingを使います。
ドキュメントを参考しながら進めていきます。
https://github.com/rails/actionpack-page_caching

流れ

  1. gemをインストールする
  2. キャッシュをONにする
  3. トップページを作成する
  4. トップページをキャッシュする
  5. キャッシュの破棄

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ヘルパーメソッドを使って有効期間を設定することができます。
https://railsdoc.com/page/expires_in

サーバーを再起動しディレクトリが作成されたことを確認します。

キャッシュファイルを一時間後に削除されます。
ページをリロードしてログにGETリクエストを実行されないことを確認します。
また、top.index.htmlを編集し、ページを再リロードしても変化を反映されないとこを確認します。

キャッシュを破棄する

expire_pageヘルパーメソッドを使います。

app/controllers/pages_controller.rb
expire_page :controller => "pages", :action => "top"

https://apidock.com/rails/v3.2.13/ActionController/Caching/Pages/expire_page

終わりに

ページキャッシュを試してみました。

Discussion