module PaginationHeaders
def set_pagination_headers(scope)
links = []
links << page_link('next', scope.next_page) if scope.next_page
links << page_link('prev', scope.prev_page) if scope.prev_page
response.headers['Link'] = links.compact.join(', ') if links.any?
response.headers['X-Total-Count'] = scope.total_count.to_s
end
def page_link(rel, page)
url = url_for(request.query_parameters.merge(page: page))
%(<#{url}>; rel="#{rel}")
end
end
class Api::SnipsController < Api::BaseController
include PaginationHeaders
def index
snips = Snip.by_active.page(params[:page]).per(25)
set_pagination_headers(snips)
render json: snips.map { |s| { id: s.id, title: s.title } }
end
end
Clients love predictable pagination. Provide Link headers and totals when feasible. This snippet shows a small helper that generates RFC5988-ish link headers for JSON endpoints.