Step by Step Ruby on Rails

Ruby on Railsで実際にWebサイトを構築する手順をまとめています。

Rails4のページキャッシングの利用例

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"が削除されました。