読者です 読者をやめる 読者になる 読者になる

【Rails4】kaminariをAPIで利用する

ページネーション用Gemで有名なkaminari。
ただ、使い方を調べてもAPIでの利用方法が見つからなかったので記載。

前提
サンプルとしてTodoをJSONで渡すAPIを実装

下記Gem導入済み
・kaminari
・active_model_serializers

modelの出力フォーマットをactive_model_serializersを利用して設定

./app/serializers/todo_serializer.rb

class TodoSerializer < ActiveModel::Serializer
  attributes :id, :body, :memo, :complete, :user_id
end


kaminariの共通設定ファイルを定義

config/initializers/kaminari_config.rb

Kaminari.configure do |config|
  config.default_per_page = 7    #最大項目数
  # config.max_per_page = nil       #最大数/page
  # config.window = 4               
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
end
Contact GitHub API Training Shop Blog About


kaminariをAPIに適用させる

config/initializers/active_model_serializer.rb

ActiveModel::Serializer.config.adapter = :json_api


controllerを実装する

class TodosController < ApplicationController

  def index
    #deviceを利用していますが、ここは各自読み替え
    todos = current_user.todos.page(params[:page] ||= 1)
    
    #meta 以下が今回の設定を適用させる
    render json: todos, meta: pagination_dict(todos)
  end

#以下省略

出力確認

{
"data":[{"id":"11","type":"todos","attributes":{"body":"APIを実装する","memo":"","complete":false,"user-id":9}},  {"id":"12","type":"todos","attributes":{"body":"はてなに投稿する","memo":"","complete":false,"user-id":9}},{"id":"13","type":"todos","attributes":{"body":"記事を投稿する","memo":"","complete":false,"user-id":9}}],
"links":{},
"meta":{"current-page":1,"next-page":null,"prev-page":null,"total-pages":1,"total-count":3}
}

meta 及び links がnodeに存在すれば完了。