Step by Step Ruby on Rails

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

Rails4のフラグメントキャッシングの利用例

 
ページキャッシュ、アクションキャッシュはページ全体またはアクション全体をキャッシュするのに対し、フラグメントキャッシュはビューの一部をキャッシュする事が出来ます。
 
目次
(1)フラグメントキャッシュの基本的な使用例
(2)有効期限、サフィックスの設定例
 
(1)フラグメントキャッシュの基本的な使用例
 
Blogのコントローラとモデル、Commentモデルを作成し、ブログにコメントを表示する例で確認してみます。
 
①モデル作成
 
$ rails generate scaffold blog title:string description:string
$ rails generate model Comment comment:string blog_id integer
 
②アソシエーション定義
 

class Blog < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :blog
end

 
③ルート設定追加
 
$ vi config/routes.rb
 
コメントをブログにネストしてルート設定します。

  resources :blogs do
    resources :comments
  end

 
④コントローラにshowアクション定義
 

  def show
    @blog = Blog.find_by(id: params[:id])
  end

 
⑤ブログ表示でコメントを表示する設定
 
下記のようにブログのコメント部分にキャッシュを設定します。
 
$ vi app/views/blogs/show.html.erb

<div>
  <%= @blog.title %><%= @blog.description %>
</div>

<%cache("blog_comments_#{@blog.id}") do%>
  <h3>Comments</h3>
  <% @blog.comments.each_with_index do|c, i|%>
    <div><%= c.comment%><span><%= c.created_at.strftime('%B %d %Y')%></span></div>
  <%end%>
<%end%>

 
⑥動作確認
 
$ tail log/development.log
 
Write fragment views/blog_comments_1/e3d08269b1091bfea3e69ecf3164a1da (1.1ms)
Rendered blogs/show.html.erb (40.1ms)
 
(2)有効期限、サフィックスの設定例
 
1)有効期限の設定例
 
①ブログの表示内容にフラグメントキャッシュを設定
 
$ more app/views/blogs/show.html.erb

<div>
  <%cache ("blog_#{@blog.id}") do%>
    <%= @blog.title %><%= @blog.description %>
  <%end%>
</div>

 
②有効期限の設定
 
各ブログを編集して変更されるキャッシュ済みの情報が古くなるので、更新した時点を有効期限として設定します。
 
updateアクションにexpire_fragmentメソッドを指定します。

  def update
    @blog = Blog.find(params[:id])
    @blog.update_attributes(blog_params)
    expire_fragment("blog_#{@blog.id}")
    render 'show'
  end

 
2)サフィックスの設定
 
デフォルトでは、キャッシュされるファイル名はコントローラのアクション名になります。これは、アクションキャッシュと重複する場合があります。そして、フラグメントキャッシュを一つのアクション内に複数設定したい場合もあります。
 
上記のように名前が重複するのを避けるためにサフィックスを設定する事が出来ます。
(設定例)
cache(:action => 'show', :controller => 'blogs', :action_suffix => 'blog_comments' )
expire_fragment(:controller => 'blogs', :action => 'show',:action_suffix => 'blog_comments')