2011-01-15 2 views
16

Интересно, может ли кто-нибудь рассказать мне, если will_paginate может поддерживать JSON из коробки или если это нужно взломать?will_paginate поддержка JSON?

Я хотел бы добавить данные страницы в ответы JSON, пока will_paginate управляет разбиением на страницы.

ответ

38

Что-то в линиях:

@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 

После того, как вы выяснить, какой формат вы хотите, вы всегда можете определить метод to_json на WillPaginate :: Коллекция.

+0

да, это то, что я хочу делать, теперь я знаю, как он работает, он, вероятно, возвращает то, что мне нужно, предоставляя прямо JSON, однако смог измените формат, как это полезно. –

+3

ознакомьтесь с документами GitHub API [1] для гораздо лучшего способа кодирования разбивки на страницы в вашем ответе (подсказка: поместите его в заголовки) [1]: http://developer.github.com/v3/#pagination – asymmetric

+2

How вы нашли эти методы? Они не указаны в wiki-файле will_paginate. – Francisco

1

will_paginate просто возвращает записи нарезанным образом. Таким образом, он просто получает массив из вашей базы данных.

Когда вы рендер как json, это рельсы, проходящие через массив объектов и вызывающие as_json на них.

Так что да, вы можете обработать визуализацию как json.

+0

Но я думаю, мне придется взломать его, чтобы он включал общее количество страниц в ответе JSON вместе с данными paginate. –

+1

это все в ответе Model.paginate - так что вам просто нужно искать его в ответ json. –

+0

Я также рассмотрю это. @mislav предоставил и пример того, что я искал, однако я вижу, что просто предоставление стандартного вывода, поскольку JSON также должен содержать информацию, которая мне нужна. –

1

Я рекомендую вам смотреть этот Railscast: Pagination with AJAX

+1

Я не использую RJS, поэтому данные должны быть в ответе JSON –

8

Добавление разбиения на страницы к API

я нашел простое решение API JSON ответа с разбиением на страницы will_pagination.

начало путем создания метода класса в ApplicationController, который будет создавать after_filter, который будет установить постраничной мета-данные в заголовках ответа:

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 

Тогда в контроллер мы хотим добавить заголовки разбиения на страницы, мы можем назвать это так:

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 

заголовки ответа, которые выглядят как этот

> 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

Это отличная разбивка на страницы для API. Не изменяйте возвращаемые данные, поместите информацию разбиения на страницы в заголовках. Суперчистое решение, отлично работает с другими, такими как Angular, который хочет получить массив результатов для индекса/списка/запроса. – Ryan

2

Самое простое решение

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

вам просто нужно добавить gem, will_pagination

это работает для меня

0

Это один помогает мне:

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

адаптированный:

Добавить этот метод к контроллеру базовой API.

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 

После этого используйте его для вашего метода визуализации.

render json: posts, meta: pagination_dict(posts)