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していますね。
まじですごいー