RailsでPagyを利用してページネーションを実装する方法

✏️️ 2019/08/31 👍️2019/09/02 🔗

pagyを利用して、Rails アプリケーションにページネーション機能を追加します。ページネーションはwill_paginatekaminariが有名ですが、pagyのほうがパフォーマンスが良いため、こちらで実装してみます。

image
参考: https://github.com/ddnexus/pagy

インストール

Gemfileにpagyを追加します。

# Gemfile
gem 'pagy'
bundle install

設定

設定ファイルを作成します。1ページ当たりの表示件数を指定します。

# config/initializers/pagy.rb
Pagy::VARS[:items] = 10

Controller

ApplicationControllerにバックエンドを含めます。

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  include Pagy::Backend
end

Controllerで、以下のように記述します。

# app/controllers/posts_controller.rb
def index
  @pagy, @posts = pagy(Post.all)

  # Controllerで、表示件数を指定することも出来ます。
  @pagy, @records = pagy(Product.some_scope, items: 30)
end

View

ページネーションをレンダリングします。フロントエンドHelperを application_helper.rb に記述します。

# app/helpers/application_helper.rb
module ApplicationHelper
  include Pagy::Frontend
end

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

<%== pagy_nav(@pagy) %>

# 以下でもOK
<%= j pagy_nav(@pagy) %>

j メソッドは、改行コード、シングルクォートやダブルクォートをJavaScriptにエスケープしてくれるメソッド(escape_javascriptメソッドのエイリアス)です。erbがrubyとして解釈した文字列でもJavaScriptを扱えるようにします。

参考: ActionView::Helpers::JavaScriptHelper

お使いのCSSのフレームワークに合わせてDesignを変更することが出来ます。
例えばBulumaなら https://ddnexus.github.io/pagy/extras/bulma.html を参照。

配列を利用する場合

以下だと、pagy メソッドの引数は ActiveRecord_Relation しか利用できません。

# app/controllers/posts_controller.rb
def index
  @pagy, @posts = pagy(Post.all)
end

配列を利用する場合は以下のようにします。

# config/initializers/pagy.rb
require 'pagy/extras/array'
def index
   @pagy, @posts = pagy_array([item, item2, ...])
end

参考

以上でRailsでPagyを利用してページネーションを実装する方法は完了です。

akito
日本のスタートアップで主にRuby on Railsを使ってプロダクト開発をしています。