2011-01-15 3 views
16

Ich frage mich, ob jemand mir sagen könnte, ob will_paginate JSON out of the box unterstützen kann oder ob dies gehackt werden muss?will_spain JSON Unterstützung?

Ich möchte den JSON-Antworten Seitendaten hinzufügen, während will_paginate Paginierung verwaltet.

Antwort

38

Etwas in den Zeilen:

@posts = Post.paginate :page => params[:page] 

respond_to do |format| 
    format.json { 
    render :json => { 
     :current_page => @posts.current_page, 
     :per_page => @posts.per_page, 
     :total_entries => @posts.total_entries, 
     :entries => @posts 
    } 
    } 
end 

Wenn Sie herausfinden, welches Format Sie wollen, können Sie eine to_json Methode auf einem WillPaginate immer definieren :: Sammlung.

+0

ja das ist, was ich tun will, jetzt weiß ich, wie es funktioniert es gibt wahrscheinlich zurück, was ich benötige, indem ich direkt zu JSON gerendert habe, jedoch fähig gewesen bin Ändern Sie das Format wie folgt. –

+3

Überprüfen Sie die GitHub API Dokumente [1] für eine viel bessere Möglichkeit der Codierung Seitenumbruch in Ihrer Antwort (Hinweis: in den Kopfzeilen) [1]: http://developer.github.com/v3/#pagination – asymmetric

+2

Wie Hast du diese Methoden gefunden? Sie sind nicht im Wiki "will_paginate" aufgeführt. – Francisco

1

will_paginate holt die Datensätze einfach zurück. Es wird nur ein Array von Ihrer Datenbank abgerufen.

Wenn Sie als JSON rendern, gehen Rails über das Array von Objekten und rufen as_json auf ihnen auf.

Also ja, Sie können will_paginate Rendern als JSON.

+0

Aber ich denke, ich muss es hacken, so dass es die Gesamtzahl der Seiten in der JSON-Antwort zusammen mit den Paginatendaten enthält. –

+1

das ist alles in der Antwort von Model.paginate - so müssen Sie nur in der JSON-Antwort suchen. –

+0

Ich werde das auch untersuchen. @mislav zur Verfügung gestellt und Beispiel für das, was ich suchte, aber ich kann sehen, dass nur das Rendern der Standardausgabe als JSON sollte auch die Informationen enthalten, die ich brauche. –

1

Ich empfehle Ihnen diese Uhr Railscast: Pagination with AJAX

+1

Ich verwende kein RJS, also müssen die Daten in der JSON-Antwort sein –

8

Paginierung an eine API gefunden

ich eine einfache Lösung für API Json Antwort Paginierung mit will_pagination Hinzufügen.

zunächst eine Klassenmethode in ApplicationController zu schaffen, die ein after_filter schaffen, die die Paginierung Meta-Daten in den Antwort-Header gesetzt werden:

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 

dann in die Steuerung, die wir Paginierung Header hinzufügen möchten, können wir es so nennen:

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 

Antwort-Header,

> 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

+0

Dies ist eine großartige Seitennummerierung für eine API. Ändern Sie die zurückgegebenen Daten nicht, sondern fügen Sie die Paginierungsinformationen in die Kopfzeilen ein. Super saubere Lösung, spielt gut mit anderen wie Angular, die eine Reihe von Ergebnissen für einen Index/eine Liste/Abfrage zurück wollen. – Ryan

2

Die einfachste Lösung

def index 
    @posts = Post.all.paginate(:page => params[:page], :per_page => 4) 
    render :json => @posts.to_json(:methods => [:image_url]) 
    end 
wie folgt aussehen

Sie brauchen nur gem, will_pagination

es für mich

0

Dieses mich funktioniert hinzufügen hilft:

https://github.com/rails-api/active_model_serializers/blob/master/docs/howto/add_pagination_links.md

Angepasst:

Fügen Sie diese Methode, um Ihre Basis API-Controller.

def pagination_dict(collection) 
    { 
    current_page: collection.current_page, 
    next_page: collection.next_page, 
    prev_page: collection.prev_page, # use collection.previous_page when using will_paginate 
    total_pages: collection.total_pages, 
    total_count: collection.total_count # use collection.total_entries when using will_paginate 
    } 
end 

Dann verwenden Sie es auf Ihre Render-Methode.