ページネーションの実装

ページネーションの実装方法

ページネーションとは、一覧機能などにおいて指定した件数毎にページを分けるもの。
以下のようなもの。

Image from Gyazo

ページネーションの実装に[kaminari]Gemを使います。
[kaminari]Gemは、配列やActiverecord::Relationsのオブジェクトに対して以下のような設定をするとページネーションが実装できる。
・1ページあたりの表示件数を何件にするか([per]メソッドを利用)
・何ページ目を表示させるのか(pageメソッドを利用)
・配列 ・デザインをどのようにするか

※ポイント
ActiveRecord::Relation : User.all や User.where(name: "test") などで取得できるものが ActiveRecord::Relation のインスタンス
ActiveRecord::CollectionProxy : has_manyなどを設定することで利用できるメソッドで取得できるのがActiveRecord::CollectionProxy のインスタンス。(ActiveRecord::CollectionProxy は ActiveRecord::Relationを継承している。)

[kaminari Gemの利用手順]

Gemfileに以下のように記述

[Gemfile]

gem "kaminari"


$ bundle install


下記コマンドでページネーションの設定ファイルを作成

$ rails g kaminari:config


一覧などを取得しているコントローラに以下のように記述

[app/controllers ファイル]

  def index
    @boards = Board.all.includes(:user).order(created_at: :desc).page(params[:page]).per(10)
  end

perメソッドに記述している1ページあたりの表示件数は、以下のように記述することも可能(設定ファイルにて1ページあたりの表示件数を設定)

[app/controllers ファイル]

  def index
    @boards = Board.all.includes(:user).order(created_at: :desc).page(params[:page])
  end
[config/initializers/kaminari_config.rb]

Kaminari.configure do |config|
  config.default_per_page = 20
end


ページネーションを表示したい場所に以下のように記述

[app/views ファイル]

<%= paginate @boards %>


ページネーションのデザインを設定
rails g kaminari:views ○○(ダウンロードしたいviewテンプレート)

$ rails g kaminari:views bootstrap4

※ポイント
ページネーションの設定ファイルは、以下のようになる。

[config/initializers/kaminari_config.rb]

Kaminari.configure do |config|
  #config.default_per_page = 25              # デフォルトでの1ページあたりの表示件数(デフォルトは 25)
  # config.max_per_page = nil                   # 表示ページの最大件数(デフォルトでは nilになっていて、無限になる)
  # config.window = 4           # 表示中のページの左右何ページ分のをページネーションに表示するかを指定(デフォルトは 4)
  # config.outer_window = 0      # 先頭ページ、及び最終ページから何ページ分のページネーションを表示するかを指定(デフォルトは 0)left、right が指定された場合は、そちらの値が優先されます。
  # config.left = 0              # 先頭ページから何ページ分のページネーションを表示するかを指定(デフォルトは 0)
  # config.right = 0                                        # 最終ページから何ページ分のページネーションを表示するかを指定(デフォルトは 0)
  # config.page_method_name = :page     # モデルに追加されるページ番号を指定するスコープの名前(デフォルトは page)
  # config.param_name = :page                  # ページ番号を渡すために使用するリクエストパラメータの名前(デフォルトは page)
  # config.max_pages = nil
  # config.params_on_first_page = false
end

[page]メソッドが使えず、[paginate_array]を使う対象
[paginate_array]を使う対象は通常通りのオブジェクト(ただの配列。例: [1, 2, 3])。 [1, 2, 3].page(params[:page])などとしてもページネーション機能は使えない。 そういった場合に使えるのがpaginate_arrayで、公式ドキュメントにもあるように以下のように使う。

Kaminari.paginate_array([1, 2, 3]).page(params[:page]) そして、paginate_arrayなしでページネーションの機能を使えるのはActiveRecord::Relationを継承しているクラス。

参考記事:

【rails】kaminariを使ってページネーションを作る - Qiita

【Rails】 kaminariの使い方をマスターしよう! | Pikawaka - ピカ1わかりやすいプログラミング用語サイト

Railsライブラリ紹介: ページングを行う「kaminari」 | TECHSCORE BLOG

kaminari - Webとデザインのあれこれ

ActiveRecord::Relationとは一体なんなのか | ⬢ Appirits spirits

Railsでページネーションを実装する(kaminari) - 線路は続くよどこまでも。

ハイパーレガシーコードクリエイターのblog : 【Rails】【メモ】Kaminari使ったら、検索結果をページネーションできなかった話