add self to pagination links

This commit is contained in:
Bruno Bacarini
2015-08-14 14:03:08 -03:00
parent 59ae84baba
commit a41d90cce4
4 changed files with 33 additions and 24 deletions

View File

@@ -20,7 +20,7 @@ ex:
"data": [ "data": [
{ {
"type": "articles", "type": "articles",
"id": "1", "id": "3",
"attributes": { "attributes": {
"title": "JSON API paints my bikeshed!", "title": "JSON API paints my bikeshed!",
"body": "The shortest article. Ever.", "body": "The shortest article. Ever.",
@@ -30,6 +30,7 @@ ex:
} }
], ],
"links": { "links": {
"self": "http://example.com/articles?page[number]=3&page[size]=1",
"first": "http://example.com/articles?page[number]=1&page[size]=1", "first": "http://example.com/articles?page[number]=1&page[size]=1",
"prev": "http://example.com/articles?page[number]=2&page[size]=1", "prev": "http://example.com/articles?page[number]=2&page[size]=1",
"next": "http://example.com/articles?page[number]=4&page[size]=1", "next": "http://example.com/articles?page[number]=4&page[size]=1",

View File

@@ -27,6 +27,8 @@ module ActiveModel
return {} if collection.total_pages == FIRST_PAGE return {} if collection.total_pages == FIRST_PAGE
{}.tap do |pages| {}.tap do |pages|
pages[:self] = collection.current_page
unless collection.current_page == FIRST_PAGE unless collection.current_page == FIRST_PAGE
pages[:first] = FIRST_PAGE pages[:first] = FIRST_PAGE
pages[:prev] = collection.current_page - FIRST_PAGE pages[:prev] = collection.current_page - FIRST_PAGE

View File

@@ -22,12 +22,12 @@ module ActionController
def using_kaminari def using_kaminari
setup setup
Kaminari.paginate_array(@array).page(params[:page]).per(params[:per_page]) Kaminari.paginate_array(@array).page(params[:page][:number]).per(params[:page][:size])
end end
def using_will_paginate def using_will_paginate
setup setup
@array.paginate(page: params[:page], per_page: params[:per_page]) @array.paginate(page: params[:page][:number], per_page: params[:page][:size])
end end
def render_pagination_using_kaminari def render_pagination_using_kaminari
@@ -50,58 +50,63 @@ module ActionController
tests PaginationTestController tests PaginationTestController
def test_render_pagination_links_with_will_paginate def test_render_pagination_links_with_will_paginate
expected_links = {"first"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", expected_links = { "self"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
"prev"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", "first"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
"next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1", "prev"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
"last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1"} "next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
"last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"}
get :render_pagination_using_will_paginate, page: 2, per_page: 1 get :render_pagination_using_will_paginate, page: { number: 2, size: 1 }
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal expected_links, response['links'] assert_equal expected_links, response['links']
end end
def test_render_only_last_and_next_pagination_links def test_render_only_last_and_next_pagination_links
expected_links = {"next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2", expected_links = { "self"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2",
"last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2"} "next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2",
get :render_pagination_using_will_paginate, page: 1, per_page: 2 "last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2"}
get :render_pagination_using_will_paginate, page: { number: 1, size: 2 }
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal expected_links, response['links'] assert_equal expected_links, response['links']
end end
def test_render_pagination_links_with_kaminari def test_render_pagination_links_with_kaminari
expected_links = {"first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", expected_links = { "self"=>"#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
"prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", "first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
"next"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1", "prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
"last"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1&per_page=1"} "next"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
get :render_pagination_using_kaminari, page: 2, per_page: 1 "last"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"}
get :render_pagination_using_kaminari, page: { number: 2, size: 1 }
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal expected_links, response['links'] assert_equal expected_links, response['links']
end end
def test_render_only_prev_and_first_pagination_links def test_render_only_prev_and_first_pagination_links
expected_links = {"first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1&per_page=1", expected_links = { "self"=>"#{KAMINARI_URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
"prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1&per_page=1"} "first"=>"#{KAMINARI_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
get :render_pagination_using_kaminari, page: 3, per_page: 1 "prev"=>"#{KAMINARI_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1"}
get :render_pagination_using_kaminari, page: { number: 3, size: 1 }
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal expected_links, response['links'] assert_equal expected_links, response['links']
end end
def test_render_only_last_and_next_pagination_links_with_additional_params def test_render_only_last_and_next_pagination_links_with_additional_params
expected_links = {"next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2&teste=additional", expected_links = { "self"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=1&page%5Bsize%5D=2&teste=additional",
"last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&per_page=2&teste=additional"} "next"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional",
get :render_pagination_using_will_paginate, page: 1, per_page: 2, teste: "additional" "last"=>"#{WILL_PAGINATE_URI}?page%5Bnumber%5D=2&page%5Bsize%5D=2&teste=additional"}
get :render_pagination_using_will_paginate, page: { number: 1, size: 2 }, teste: "additional"
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
assert_equal expected_links, response['links'] assert_equal expected_links, response['links']
end end
def test_array_without_pagination_links def test_array_without_pagination_links
get :render_array_without_pagination_links get :render_array_without_pagination_links, page: { number: 2, size: 1 }
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
refute response.key? 'links' refute response.key? 'links'
end end
def test_array_omitting_pagination_options def test_array_omitting_pagination_options
get :render_array_omitting_pagination_options get :render_array_omitting_pagination_options, page: { number: 2, size: 1 }
response = JSON.parse(@response.body) response = JSON.parse(@response.body)
refute response.key? 'links' refute response.key? 'links'
end end

View File

@@ -42,6 +42,7 @@ module ActiveModel
def links def links
{ {
links:{ links:{
self: "http://example.com?page%5Bnumber%5D=2&page%5Bsize%5D=1",
first: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1", first: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1",
prev: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1", prev: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1",
next: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1", next: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1",