Rails4のアクションキャッシュの利用例をまとめました。
ページキャッシュは、認証などのフィルターが定義されている場合は使用できませんが、アクションキャッシュはbeforeフィルターが定義されていても使用できます。
目次
(1)アクションキャッシュを使用するには?
(2)アクションキャッシュの基本的な使用例
(3)アクションキャッシュの設定例
(1)アクションキャッシュを使用するには?
Rail4からはアクションキャッシュ機能がコアから削除されているのでGemを追加する必要があります。
$ vi Gemfile
gem ‘actionpack-action_caching’
$ bundle install
Using actionpack-action_caching (1.1.1)
(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_action :index def index @blogs = Blog.all end end
③データを登録
$rails c
> Blog.create(title: ‘sample post’, description: “sample”)
④動作確認
ブラウザで”http://localhost:3000/blogs/”にアクセス。
tmp/cacheディレクトリ配下にいくつかのディレクトリが自動で作成されその配下にキャッシュファイル作成されていました。
・ログ確認
$ tail -500 log/development.log
Write fragment views/localhost:3000/blogs (1.0ms)
Completed 200 OK in 1455ms (Views: 1419.3ms | ActiveRecord: 0.7ms)
(3)アクションキャッシュの設定例
1)ifやunlessを使って条件を指定
jsonリクエストの場合にはキャッシュしない場合は次のように設定します。
$ vi app/controllers/blogs_controller.rb
caches_action :index, if: Proc.new{|c|!c.request.format.json?}
2)有効期限を設定
:expires_inオプションを設定します。デフォルトの単位は秒です。
$ vi app/controllers/blogs_controller.rb
caches_action :index, if: Proc.new{|c|!c.request.format.json?}, expires_in: 60
有効期限が過ぎてからアクセスするとキャッシュファイルが同じファイル名で取得されて更新されていました。
3)アクションの中身のみをキャッシュする
layout: falseを指定します。
$ vi app/controllers/blogs_controller.rb
caches_action :index, if: Proc.new{|c|!c.request.format.json?}, expires_in: 60, layout: false