kaminariを使ってページネーションを実装

@a_matsuda さんの作られた、kaminariを使ってページネーションを実現しようと思います。

自分で実装しようと思うと結構めんどくさいのですが、kaminari使うと一発でできちゃいます。すごすぎです。

まずはGemfileに追加してbundle installします。

gem 'kaminari'
$ bundle install

Taskというモデルのindexアクションに対してページネーションの機能を追加してみます。

created_atカラムの順で8件ずつ表示させたいときは、以下のようにします。メソッドの中を、以下のようにします。

# app/controllsers/tasks_controller.rb
class TaskController < ApplicationController
  def index
    @tasks = Task.order("created_at").page(params[:page]).per(8)
  end
end

あとはviewの下のほうとかに<%= paginate @Tasks %>を加えるだけです。 

例えば以下のようになるかと思います。

<h2>サービス一覧</h2>

<% @services.each_with_index do |service, index| %>
  <ul>
    <li><%= link_to service.id, service, id: "link#{index}" %></li>
    <li><%= service.description %></li>
    <li><%= link_to "お願いする", new_order_path(service: service.id) %></li>
  </ul>
<% end %>

<%= paginate @services %>

これで完成です。すごい!

ちなみに吐き出されるqueryを確認してみると...

Service Load (0.4ms)  SELECT  `services`.* FROM `services`  ORDER BY created_at LIMIT 8 OFFSET 0

みたいになってます。なるほどーOFFSETとLIMITで指定するのか。LIMITが効いてるのでそのページに表示する分だけfetchしていますね。

まじですごいー