りゅうじの学習blog

学習したことをアウトプットしていきます。

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

kaminariのセットアップ

まずインストール

#Gemfile

gem 'kaminari'
#ターミナル

bundle install --path vendor/bundle

続いてkaminari の設定を生成。

#ターミナル

$ rails g kaminari:config

上記コマンドにより、config/initializers ディレクトリ直下に、以下の設定ファイルが生成される。

#config/initializers/kaminari_config.rb

# frozen_string_literal: true

Kaminari.configure do |config|
  # config.default_per_page = 25
  # 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

このファイル内でページネーションのデフォルト値を記載できます。(こちらに記載しコントローラに書かない事)

  • default_per_page

    • 1ページあたりの表示件数(デフォルトは25レコード)
  • max_per_page

    • 1ページあたりの最大表示件数(デフォルトはnil。つまり無限)
  • max_pages

    • 最大ページ数(デフォルトはnil
  • window

    • 現在のページから、左右何ページ分のリンクを表示させるか(デフォルトは4件)
      • 上の例では現在は9ページ目で、左右4ページずつ表示させている。
  • outer_window

    • 最初(First)と最後(Last)のページから、左右何ページ分のリンクを表示させるか(デフォルトは0件)
  • left

    • 最初(First)のページから、何ページ分のリンクを表示させるか(デフォルトは0件)
      • 上の例では2ページ表示させている(1、2ページ目)。
  • right

    • 最終(Last)ページから、何ページ分のリンクを表示させるか(デフォルトは0件)
      • 上の例では1ページ表示させている(17ページ目)。
  • page_method_name

    • モデルに追加されるページ番号を指定するスコープの名前:page by default
  • param_name

    • ページ番号を渡すために使用するパラメータ名(デフォルトは:page)
    • Board.page(params[:page])のようにparamsメソッドで取得できる。
  • params_on_first_page

    • false by default

    例えばデフォルト値を変えたいならばこのように

#config/initializers/kaminari_config.rb

config.default_per_page = 25 ←ここをコメントアウトし適宜数値を変更する

すればOKです!

コントローラーの設定

board_controller だとして降順で表示されていきます。

#app/controllers/boards_controller.rb

class BoardsController < ApplicationController
  def index
    @boards = Board.all.includes(:user).order(created_at: :desc).page(params[:page])
  end
end
  • perメソッド: 1ページあたりの表示件数は何件にするか
  • pageメソッド:何ページ目を表示させるのか

この二つのメソッドでコントローラで設定ができます。(perメソッドは最初のconfig/initializers にて設定を終えているのでここでは使っていません)

kaminariは配列にも使用可能で

#config/initializers/kaminari_config.rb

def index
  @board = Board.all.includes(:user).order(created_at: :desc)
  @board = Kaminari.paginate_array(@board).page(params[:page]).per(20)
end

paginata_arrayメソッド で配列に使用することができます。

viewの設定

#表示したいview

<%= paginate @board %>

最後に

読んでいただいた方、ありがとうございました。