2012-02-16 8 views
12

Ben bu şablonu sayfalandırmak nasılRABL tahsilat

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

Cadı verir:

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

Ve bu render için bazı sayfalandırma params eklemek eklemek istiyorum:

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

Herhangi bir fikrin var mı? Çok teşekkürler!

+0

Bu örnekte Tamamen katılıyorum – shingara

+0

tarafından Github tarafından yapılacak gibi başlığındaki [ 'Linki'] Sayfalandırmayı bilgi eklemek daha iyidir. Ancak şu anda bazı güncel API'lerle uyumlu kalmam gerekiyor. –

cevap

16

Noob sorusu için özür dilerim, whitch README tarafından cevaplandı.

object false 

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

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

Not: Burada pagination bir örnek ben sayfalandırmada Kaminari kullanıyorum.

+0

Nesne bir nesne olduğunda, nesne (false) 'i çağırıyor görünmüyor. Index.rabl'ınızın neye benzediğini anlama şansınız var mı? –

1

not, will_paginate çalışmalarınedeniyle 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

Toplam sayfa hesaplaması şu şekilde olmalıdır: "stuff.total_entries.to_f/stuff.per_page) .ceil", son sayfanın dolu olmaması nedeniyle. – arnab

+0

@arnab Teşekkürler, Yanıtı, varsayılan görünümler – davidcollom

3

kaminari ve rabl ararken bu ilk ve hemen hemen sadece ilgili sonucudur. Bu nedenle, this gibi bağlantılar üreten HAL Specification'a göre bir çözüm bırakmak istiyorum.

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

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

node(:_links) do 
    paginate @posts 
end 

sonra paginate yöntemi tanımlamak devam:

# 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 

Ve son olarak, gerekli kontrol olarak yardımcı dahil

Yani ilk bakış ile başlar.

helper :api 

Ben Zag zag .. 'ın çözüm olmadan bu yapamazdım, bu yüzden .. Çok teşekkür ederim: yardımcı tüm API kontrolörleri devralan hangi bir Api::BaseController, dahil edilebilir!

+1

yansıtacak şekilde güncelleştirildi. –

+0

tüm yardımcıları içerir, böylece tüm yardımcıları içermez ya da sadece "paginate" yöntemini yeniden adlandırmak için Rails yapılandırın, çünkü normal görünümlerde sayfalandırma koparır – Ashitaka

+0

Evet, sadece not edilmelidir, çünkü rayların varsayılan davranışı çözümle çelişiyor –

0

Bu aradığınızı olabilir;)

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

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