2012-02-16 4 views
12

私は、このテンプレートを持っている:Rablのコレクションをページ分割する方法

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

をそして私はこれをレンダリングするために、いくつかのページネーションのparamsを追加するために追加したい:

# 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 
      } 
     } 
    ], 
    "total": 42, 
    "total_pages": 12 
} 

アイデア?どうもありがとう!

+0

HEADERの改ページ情報を追加する方が良いでしょう[「リンク」]のように、私は完全に同意する例 – shingara

+0

でのGithubで行います。しかし、今現在、私はいくつかの現在のAPIと互換性を保たなければなりません。 –

答えて

16

申し訳ありませんが、私の質問には、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を使用しています。 will_paginateため

+0

オブジェクトが配列のときに 'object(false)'を呼び出すことは、私にとってはうまくいかないようです。あなたのindex.rablのように見えるかもしれませんか? –

1

ノートには、次のような作品を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

最後のページがいっぱいでないことを考慮して、合計ページ計算は 'stuff.total_entries.to_f/stuff.per_page).ceil'である必要があります。 – arnab

+0

@arnabありがとうございました。回答は – davidcollom

3

kaminarirablを検索する場合、これは最初のとほとんど唯一の関連する結果です。このように、ここではのようなリンクを生成するHAL Specificationの解決策を残したいと思います。 paginateメソッドを定義するために進んで次に

# 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 

をそして最後に、必要なコントローラでヘルパーを含めます。

helper :api 

は私がザグジグザグ.. 'sの解決なしにこれを行っていなかったので...どうもありがとう:ヘルパーは、すべてのAPIコントローラが継承するApi::BaseController、中に含めることができます!

+1

のように更新され、デフォルトの表示ではすべてのヘルパーが含まれていますので –

+0

のように表示されるので、すべてのヘルパーが含まれないように設定するか "paginate" – Ashitaka

+0

ええ、レールのデフォルトの動作が解決策と矛盾しているので注意する必要があります –

0

これは、あなたが探しているものかもしれません;)

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

node(:pagination) do 
    { 
    total:@posts.count, 
    total_pages: 20 
    } 
end 
関連する問題