ページキャッシュ、アクションキャッシュはページ全体またはアクション全体をキャッシュするのに対し、フラグメントキャッシュはビューの一部をキャッシュする事が出来ます。
目次
(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’)