module PagerApi::Pagination::WillPaginate

Public Instance Methods

paginate(*args) click to toggle source
# File lib/pager_api/pagination/will_paginate.rb, line 5
def paginate(*args)
  options = args.extract_options!
  collection = args.first

  paginated_collection = paginate_collection(collection, options)

  options[:json] = paginated_collection

  options[:meta] = meta(paginated_collection, options) if PagerApi.include_pagination_on_meta?

  pagination_headers(paginated_collection) if PagerApi.include_pagination_headers?

  render options
end

Private Instance Methods

meta(collection, options = {}) click to toggle source
# File lib/pager_api/pagination/will_paginate.rb, line 73
def meta(collection, options = {})
  {
    pagination:
    {
      per_page: options[:per_page] || params[:per_page] || ::WillPaginate.per_page,
      total_pages: collection.total_pages,
      total_objects: collection.total_entries,
      links: pagination_links(collection)
    }
  }
end
pages(collection) click to toggle source
# File lib/pager_api/pagination/will_paginate.rb, line 56
def pages(collection)
  {}.tap do |paging|
    paging[:first] = 1
    paging[:last] = collection.total_pages

    paging[:prev] = collection.current_page - 1 unless collection.current_page == 1
    paging[:next] = collection.current_page + 1 unless collection.current_page >= collection.total_pages
  end
end
paginate_collection(collection, options = {}) click to toggle source
# File lib/pager_api/pagination/will_paginate.rb, line 66
def paginate_collection(collection, options = {})
  options[:page] = params[:page] || 1
  options[:per_page] = options.delete(:per_page) || params[:per_page]

  collection.paginate(options)
end
pagination_headers(collection) click to toggle source

Link: <example.com/api/v1/users?page=“2”>; rel=“next”, <example.com/api/v1//users?page=“5”>; rel=“last”, <example.com/api/v1//users?page=“1”>; rel=“first”, <example.com/api/v1/users?page=“1”>; rel=“prev”,

# File lib/pager_api/pagination/will_paginate.rb, line 26
def pagination_headers(collection)
  links = (headers['Link'] || "").split(',').map(&:strip)
  clean_url = request.original_url.sub(/\?.*$/, '')

  paging_info = pages(collection)

  paging_info.each do |key, value|
    query_params = request.query_parameters.merge(page: value)
    links << %Q( <#{clean_url}?#{query_params.to_param}>; rel="#{key}" )
  end

  headers['Link'] = links.join(", ") unless links.empty?
  headers[PagerApi.total_pages_header] = collection.total_pages
  headers[PagerApi.total_count_header] = collection.total_entries

  return nil
end