Dodawanie Pagination do API
znalazłem proste rozwiązanie API Odpowiedź JSON paginacji z will_pagination.
zacząć od stworzenia metody klasy w ApplicationController
że będzie utworzyć after_filter
która będzie wyznaczać paginacji meta-danych w nagłówkach odpowiedzi:
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
Następnie w kontroler, do którego chcemy dodać nagłówki stronicowania, możemy nazwać tak:
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
nagłówki odpowiedzi, które wyglądają jak to
> 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
tak, to jest to, co chcę zrobić, teraz wiem, jak to działa, prawdopodobnie zwraca to, czego potrzebuję, renderując bezpośrednio do JSON, jednak udało się zmienić format, jak to jest przydatne. –
sprawdź dokumentację API GitHub [1], aby uzyskać znacznie lepszy sposób kodowania paginacji w odpowiedzi (podpowiedź: umieść w nagłówkach) [1]: http://developer.github.com/v3/#pagination – asymmetric
Jak znalazłeś te metody? Nie są one wymienione w wiki typu will_paginate. – Francisco