will_paginate поддержка JSON? - PullRequest
16 голосов
/ 15 января 2011

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

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

Ответы [ 6 ]

40 голосов
/ 16 января 2011

Что-то в строках:

@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 :: Collection.

8 голосов
/ 17 сентября 2015

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

Я нашел простое решение для разбиения API Json Response Pagination с помощью 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

Источник - добавление нумерации страниц в API

2 голосов
/ 24 апреля 2017

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

Добавьте этот метод в базовый контроллер 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)
2 голосов
/ 17 сентября 2015

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

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

Вам просто нужно добавить gem 'will_paginate'

Это работает для меня.

1 голос
/ 15 января 2011

Я рекомендую вам посмотреть этот Railscast: Пагинация с AJAX

1 голос
/ 15 января 2011

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

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

Так что да, вы можете will_paginate рендерингакак JSON.

...