Wie man Rabls Sammlungen paginiert
-
26-10-2019 - |
Frage
Ich habe diese Vorlage:
# app/views/posts/index.rabl
collection @posts => :posts
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:read) { |post| post.read_by?(@user) }
Hexe kehrt zurück:
{
"posts": [
{
"post": {
"id": 5,
"title": "...",
"subject": "...",
"user": {
"full_name": "..."
},
"read": true
}
}
]
}
Und ich möchte hinzufügen, um einige Paginationsparams hinzuzufügen, um dies zu rendern:
{
"posts": [
{
"post": {
"id": 5,
"title": "...",
"subject": "...",
"user": {
"full_name": "..."
},
"read": true
}
}
],
"total": 42,
"total_pages": 12
}
Irgendwelche Ideen? Danke vielmals!
Lösung
Entschuldigung für meine Noob -Frage, Whitch wurde vom Readme beantwortet. Hier ist ein Beispiel für Pagination:
object false
node(:total) {|m| @posts.total_count }
node(:total_pages) {|m| @posts.num_pages }
child(@posts) do
extends "api/v1/posts/show"
end
Hinweis: Ich benutze Kaminari
für Pagination.
Andere Tipps
Bei der Suche nach kaminari
und rabl
Dies ist das erste und so ziemlich nur relevantes Ergebnis. Als solches möchte ich hier eine Lösung nach dem zurücklassen Halspezifikation Das erzeugt Links wie Dies.
Beginnen Sie zuerst mit der Aussicht:
# api/v1/posts/index.rabl
object false
child(@posts) do
extends 'api/v1/posts/show'
end
node(:_links) do
paginate @posts
end
Definieren Sie dann die paginierte Methode:
# app/helpers/api_helper
module ApiHelper
def paginate(collection)
current_page_num = collection.current_page
last_page_num = collection.total_pages
{
:first => first_page,
:previous => previous_page(current_page_num),
:self => current_page(current_page_num),
:next => next_page(current_page_num, last_page_num),
:last => last_page(last_page_num)
}
end
def first_page
{ :href => url_for(:page => 1) }
end
def previous_page(current_page_num)
return nil if current_page_num <= 1
{ :href => url_for(:page => current_page_num-1) }
end
def current_page(current_page_num)
{ :href => url_for(:page => current_page_num) }
end
def next_page(current_page_num, last_page_num)
return nil if current_page_num >= last_page_num
{ :href => url_for(:page => current_page_num+1) }
end
def last_page(last_page_num)
{ :href => url_for(:page => last_page_num) }
end
end
Und schließlich den Helfer in die notwendigen Controller einbeziehen. Der Helfer könnte in a enthalten sein Api::BaseController
, von denen alle API -Controller erben:
helper :api
Ich hätte das ohne Zag Zags Lösung nicht tun können, also .. vielen Dank!
Hinweis, für Will_Paginate 3.0.0 Die folgenden Werke:
node(:total) {|m| @posts.total_entries }
node(:total_pages) {|m| (@posts.total_entries.to_f / @posts.per_page).ceil }
node(:page_num){|m| @posts.current_page}
Dies könnte das sein, wonach Sie suchen;)
object false
node :comments do
partial('posts/index', object: @posts)
end
node(:pagination) do
{
total:@posts.count,
total_pages: 20
}
end