Skip to content

Frankiepager

Pagination

Pager hash keys

Key Description
page Current page (clamped to valid range)
per_page Items per page
total Total item count
total_pages Total number of pages
from First item number on this page
to Last item number on this page
has_prev True if there is a previous page
has_next True if there is a next page
prev_page Previous page number or nil
next_page Next page number or nil
first_page True if on the first page
last_page True if on the last page

Functions

paginate(opts)

Compute pagination. Opts: total, page, per_page.

stitch "frankiepager"

pg = paginate({total: 247, page: 3, per_page: 20})
puts "Page #{pg["page"]} of #{pg["total_pages"]}"
puts "Showing items #{pg["from"]}#{pg["to"]} of #{pg["total"]}"
puts "Has prev: #{pg["has_prev"]}  Has next: #{pg["has_next"]}"
puts "Prev page: #{pg["prev_page"]}  Next page: #{pg["next_page"]}"

 Page 3 of 13
 Showing items 4160 of 247
 Has prev: true  Has next: true
 Prev page: 2  Next page: 4

page_slice(items, page, per_page)

Return the slice of a vector for the given page.

stitch "frankiepager"

items = seq(1, 50)
puts "Page 2 of seq(1,50) at 10/page:"
puts page_slice(items, 2, 10)

 Page 2 of seq(1,50) at 10/page:
 [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

page_links(pager, url_template)

Generate a vector of {label, url, active} hashes for navigation links.

Use {page} in the template: "/posts?page={page}".

stitch "frankiepager"

pager = paginate({total: 60, page: 3, per_page: 10})

links = page_links(pager, "/posts?page={page}")

links.each do |link|
  if link["active"]
    puts "[#{link["label"]}]  #{link["url"]}"   # current page — marked active
  else
    puts " #{link["label"]}   #{link["url"]}"
  end
end

   Prev   /posts?page=2
→  1   /posts?page=1
  2   /posts?page=2
 [3]  /posts?page=3
→  4   /posts?page=4
  5   /posts?page=5
  6   /posts?page=6
  Next    /posts?page=4