Adición de paginación a una API
He encontrado una solución fácil a la API Respuesta JSON paginación con will_pagination.
inicio mediante la creación de un método de clase en ApplicationController
que creará un after_filter
que establecerá el meta-datos de la paginación en las cabeceras de respuesta:
application_controller.rb
class ApplicationController < ActionController::Base
protected
def self.set_pagination_headers(name, options = {})
after_filter(options) do |controller|
results = instance_variable_get("@#{name}")
headers["X-Pagination"] = {
total: results.total_entries,
total_pages: results.total_pages,
first_page: results.current_page == 1,
last_page: results.next_page.blank?,
previous_page: results.previous_page,
next_page: results.next_page,
out_of_bounds: results.out_of_bounds?,
offset: results.offset
}.to_json
end
end
end
Luego, en el controlador que queremos agregar los encabezados de paginación podemos llamarlo así:
widgets_controller.rb
class Api::V1::WidgetsController < Api::V1::BaseController
set_pagination_headers :widgets, only: [:index]
def index
@widgets = Widget.all.paginate(params).order("created_at desc")
respond_with @widgets
end
end
cabeceras de respuesta que se ven así
> Cache-Control:max-age=0, private, must-revalidate
> Connection:keep-alive Content-Type:application/json; charset=utf-8
> Etag:"fe70f7bae4c6e5cdea7867aa7fc0c7b4"
> X-Pagination:{"total":14,"total_pages":1,"first_page":true,"last_page":true,"previous_page":null,"next_page":null,"out_of_bounds":false,"offset":0}
> Server:thin 1.3.1 codename Triple Espresso
> Set-Cookie:_widgets_session=BAh7CEkiD3Nlc3Npb25faWQGOgZFRkkiJTAzYjVlNzkwZTIyNzU4YTYwMDU0M2MwOTQ2ZWI3YWU2BjsAVEkiDWxhc3RfdXJsBjsARkkiM2h0dHA6Ly9tYWluYW5kbWUtc3RhZ2luZy5oZXJva3VhcHAuY29tL3VzZXJzLzEGOwBGSSIQX2NzcmZfdG9rZW4GOwBGSSIxdjd0SEp6cVhKamh5YTh1cnBUdmpBb0w5aVA0bS9QTEdON3g1UlFUYnBkND0GOwBG--71b3a24c216a414d8db04f312b5300c818e6bba4;
> path=/; HttpOnly Transfer-Encoding:Identity
> X-Request-Id:61b383ade49cba8b24a715a453ed6e1f X-Runtime:0.191485
> X-Ua-Compatible:IE=Edge,chrome=1
Source -Adding Pagination to an API
sí, eso es lo que quiero hacer, ahora sé cómo funciona, probablemente devuelva lo que necesito al procesar directamente a JSON, sin embargo, he podido cambiar el formato de esta manera es útil. –
revisa los documentos API de GitHub [1] para una forma mucho mejor de codificar la paginación en tu respuesta (sugerencia: ponla en los encabezados) [1]: http://developer.github.com/v3/#pagination – asymmetric
Cómo ¿Encontraste estos métodos? No están listados en la wiki de will_paginate. – Francisco