Как разбить коллекции Рабла на страницы - PullRequest
12 голосов
/ 16 февраля 2012

У меня есть этот шаблон:

# app/views/posts/index.rabl
collection @posts => :posts
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:read) { |post| post.read_by?(@user) }

Ведьма возвращает:

{
    "posts": [
        {
            "post": {
                "id": 5,
                "title": "...",
                "subject": "...",
                "user": {
                    "full_name": "..."
                },
                "read": true
            }
        }
    ]
}

И я хотел бы добавить несколько параметров нумерации страниц для рендеринга:

{
    "posts": [
        {
            "post": {
                "id": 5,
                "title": "...",
                "subject": "...",
                "user": {
                    "full_name": "..."
                },
                "read": true
            }
        }
    ],
    "total": 42,
    "total_pages": 12
}

Есть идеи? Большое спасибо!

Ответы [ 4 ]

16 голосов
/ 17 февраля 2012

Извините за мой вопрос о нубе, на которого README ответил.Вот пример нумерации страниц:

object false

node(:total) {|m| @posts.total_count }
node(:total_pages) {|m| @posts.num_pages }

child(@posts) do
  extends "api/v1/posts/show"
end

Примечание: я использую Kaminari для нумерации страниц.

3 голосов
/ 09 мая 2013

При поиске kaminari и rabl это первый и в значительной степени единственный релевантный результат.Поэтому я хотел бы оставить здесь решение в соответствии со спецификацией HAL , которая генерирует ссылки типа this .

Итак, сначала начнем с представления:

# api/v1/posts/index.rabl
object false

child(@posts) do
  extends 'api/v1/posts/show'
end

node(:_links) do
  paginate @posts
end

Затем перейдите к определению метода разбивки на страницы:

# 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

И, наконец, включите помощника в необходимые контроллеры.Помощник может быть включен в Api::BaseController, от которого наследуются все контроллеры API:

helper :api

Я бы не смог сделать это без решения Zag zag .., так что ... Большое спасибо!

1 голос
/ 21 августа 2012

примечание, для will_paginate 3.0.0 работают следующие:

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}
0 голосов
/ 21 июня 2013

Это может быть то, что вы ищете;)

object false
node :comments do
  partial('posts/index', object: @posts)
end

node(:pagination) do
  {
    total:@posts.count,
    total_pages: 20
  }
end
...