ページネーションの実装
ページネーションの実装方法
ページネーションとは、一覧機能などにおいて指定した件数毎にページを分けるもの。
以下のようなもの。
ページネーションの実装に[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
ActiveRecord::Relationとは一体なんなのか | ⬢ Appirits spirits
Railsでページネーションを実装する(kaminari) - 線路は続くよどこまでも。
ハイパーレガシーコードクリエイターのblog : 【Rails】【メモ】Kaminari使ったら、検索結果をページネーションできなかった話