はじめに
Rails API
とkaminari
使用時に全体のページ数を取得してレスポンスしたかったので、その方法についてまとめます。
手順
再利用できるよう、consernsにモジュールとして切り出しておきます。
kaminari
では、Article.page(1).total_pages
のようにtotal_pages
を使うことで全体のページ数を取得することができます。
app/controllers/concerns/pagination.rb
module Pagination
extend ActiveSupport::Concern
def pagination(records)
{
total_pages: records.total_pages # 全体のページ数
}
end
end
meta: pagination(articles)
でpagination
を呼び出し、meta
キーを配下として値を時データを参照ができ、最終的にadapter: :json
でarticles
と一緒にレスポンスできるようにします。
class Api::V1::ArticlesController < Api::V1::BaseController
include Pagination
def index
articles = Article.published.order(created_at: :desc).page(params[:page] || 1).per(10).includes(:user)
render json: articles, meta: pagination(articles), adapter: :json
end
end
レスポンス
{
"articles": [
{
"id": 30,
"title": "タイトル",
"content": "本文",
}
],
"meta": {
"total_pages": 3
}
}