こたつとみかんとプログラミング

33才実務未経験ですがウェブエンジニアにジョブチェンジするために勉強したことをアップするためのブログです。

ページネーションの実装(kaminari)

kaminari を使ってみたのでメモ。
will_paginate よりもこっちのほうがとっつきやすい?ような気がした。

gem をインストール(bundle install)

gem はこちら
https://github.com/kaminari/kaminari

controller でページ番号に対応する範囲のデータを取得
# app/controller/tasks_controller.rb

def index
  @tasks = current_user.tasks.page(params[:page])
 ...
end

gemをインストールすると、表示するページ番号がparams[:page]でアクションに渡される。
page というスコープを使うだけで params[:page] に表示されるべきデータ範囲を検索できる。

view にページネーションのための情報を表示
# app/views/tasks/index.html.erb

<div class="mb-3">
  <%= paginate @task %>
  <%= page_entries_info @task %>
</div>

以下の2つのヘルパーメソッドを使用する。
ヘルパーメソッドの定義はここ
kaminari/helper_methods.rb at master · kaminari/kaminari · GitHub

paginate
現在、どのどのページを表示しているかを取得・表示する。
また、他のページに移動するためのリンクを生成し、表示する。

page_entries_info
全データが何件あり、現在どのデータが表示されているかの情報を表示

(必要あれば)locales の設定

kaminari は内部に英語の翻訳しか持っていないので、ja の翻訳ファイルを追加する。

ja:
  views:
    pagination:
      first: "&laquo; 最初"
      last: "最後 &raquo;"
      previous: "&lsaquo; 前"
      next: "次 &rsaquo;"
      truncate: "..."
  helpers:
    page_entries_info:
      one_page:
        display_entries:
          zero: ""
          one: "<strong>1-1</strong>/1件中"
          other: "<strong>1-%{count}</strong>/%{count}件中"
      more_pages:
        display_entries: "<strong>%{first}-%{last}</strong>/%{total}件中"

デザインの適用

$ bin/rails g kaminari:views bootstrap4

上記は bootstrap4 のデザインテンプレートを使用する例。
このコマンドで、app/view/kaminari 配下にビューテンプレートファイルが追加される。
他のテンプレートを使用するときはこちらを参照
GitHub - amatsuda/kaminari_themes

(必要あれば)表示件数の変更

3通りある。

1. perスコープで指定する。

# app/views/tasks/index.html.erb

def index
  @tasks = current_user.tasks.page(params[:page]).per(50)
 ...
end

2. modelに設定する

# app/models/task.rb
class Task < ApplicationRecord
  paginates_per 50
  ...

3. kaminari 用の config ファイルを作って設定する

$ bin/rails g kaminari:config
# config/initializers/kaminari_config.rb

# frozen_string_literal: true
Kaminari.configure do |config|
  config.default_per_page = 50
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end
  ...

参考記事
https://github.com/kaminari/kaminari
https://www.amazon.co.jp/%E7%8F%BE%E5%A0%B4%E3%81%A7%E4%BD%BF%E3%81%88%E3%82%8B-Ruby-Rails-5%E9%80%9F%E7%BF%92%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89-%E5%A4%A7%E5%A0%B4%E5%AF%A7%E5%AD%90/dp/4839962227