Rails4のページキャッシュ利用例をまとめました。
ページキャッシュはファイル内のアクションの出力を保存するメカニズムで、この仕組みによってActionpackを通さずに応答できます。
目次
(1)ページキャッシュを使用するには?
(2)indexページにページキャッシュを設定する例
(3)ページキャッシュに有効期限を設定する例
(4)indexとshowアクションにページキャッシュを設定する例
(1)ページキャッシュを使用するには?
Rail4からはページキャッシュ機能がコアから削除されているのでGemを追加する必要があります。
①’actionpack-page_caching’をインストール
$ vi Gemfile
gem ‘actionpack-page_caching’
$ bundle install
Installing actionpack-page_caching (1.0.2)
②設定
$ vi config/environments/development.rb
config.action_controller.perform_caching = true
config.action_controller.page_cache_directory = “#{Rails.root.to_s}/public/deploy”
(2)ページキャッシュの基本的な使用例
ここでは、”blog”というコントローラを作成し、ページキャッシュを設定しています。
①scaffoldで”blog”を作成
$ rails generate scaffold blog title:string description:string
$ bundle exec rake db:migrate
②indexアクションにページキャッシュを設定
$ vi app/controllers/blogs_controller.rb
class BlogsController < InheritedResources::Base caches_page :index def index @blogs = Blog.all end end
③データを登録
$rails c
> Blog.create(title: ‘sample post’, description: “sample”)
④動作確認
ブラウザで”http://localhost:3000/blogs/”にアクセス。
・public/deploy/ディレクトリ内に”blogs.html”というファイルが作成され、ファイルとしてキャッシュされていることを確認
・ログ確認
$ tail -500 log/development.log
Started GET "/blogs/" for 49.240.165.90 at 2014-04-20 21:31:38 +0900 Processing by BlogsController#index as HTML Blog Load (0.2ms) SELECT "blogs".* FROM "blogs" Rendered blogs/index.html.erb within layouts/application (2.1ms) Write page ・・public/deploy/blogs.html (0.3ms) Completed 200 OK in 21ms (Views: 19.0ms | ActiveRecord: 0.2ms)
(3)ページキャッシュに有効期限を設定する例
新規ブログを登録した場合は、そのブログの内容がindexページに追加されるので、キャッシュされたファイルの内容が古くなってしまいます。そこで、createアクション実行時を有効期限としてページキャッシュを設定します。
1)createアクションを定義
下記のようにcreateアクションに
expire_page action: :index
を設定し、indexアクションに対するページキャッシュの有効期限を設定します。
$ vi app/controllers/blogs_controller.rb
caches_page :index def index @blogs = Blog.all end def create expire_page action: :index @blog = Blog.new(blog_params) @blog.save render 'show' end private def blog_params params.require(:blog).permit(:title, :description) end end
2)動作確認
①新しいデータ登録
http://localhost:3000/blogs/new
②キャッシュファイルが削除されていることを確認
キャッシュファイルを保存するディレクトリ(ここではpublic/deploy)内にあったキャッシュファイルが削除されている事を確認
③ログを確認
Started POST "/blogs" for ・・・ Processing by BlogsController#create as HTML : Expire page ・・public/deploy/blogs.html (0.0ms) (0.1ms) begin transaction SQL (0.4ms) INSERT INTO "blogs" ("created_at", "descripti :
(4)indexとshowアクションにページキャッシュを設定
1)showにページキャッシュを設定
indexに加え、showにもページキャッシュを設定します。
$ vi app/controllers/blogs_controller.rb
caches_page :index, :show
2)キャッシュファイル生成の確認
①indexページ(http://localhost:3000/blogs
キャッシュファイル保存ディレクトリ(ここではpublic/deploy)内に
blogs.html
という名前でキャッシュファイルが作成されます。
②showページ(http://localhost:3000/blogs/1)
キャッシュファイル保存ディレクトリ(ここではpublic/deploy)内に”blogs”ディレクトリが作成され、そのディレクトリ内にそのブログのidを名前としたファイルが作成されます。
1.html
3)有効期限を設定
各ブログの情報を修正した場合は、その修正したブログIDのキャッシュファイルは古くなるので、updateアクション時を有効期限として設定します。
updateアクションにshowアクションに対するページキャッシュの有効期限を設定します。updateは各投稿単位に更新するので投稿のIDを指定して、該当する投稿のキャッシュファイルのみ有効期限を設定します。
indexページの情報も古くなるのでindexアクションに対する有効期限も設定します。
$ vi app/controllers/blogs_controller.rb
caches_page :index, :show : def update expire_page action: :index expire_page action: :show, id: params[:id] @blog = Blog.find(params[:id]) @blog.update_attributes(blog_params) render 'show' end private def blog_params params.require(:blog).permit(:title, :description) end end
4)有効期限の動作確認
投稿IDが1のブログを変更すると”1.html”のキャッシュファイルとindexのキャッシュファイル”blogs.html”が削除されました。