Skip to content

Commit 018b71c

Browse files
committed
return complete URIs on pagination links
1 parent a61ec32 commit 018b71c

File tree

8 files changed

+45
-16
lines changed

8 files changed

+45
-16
lines changed

docs/howto/add_pagination_links.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ ex:
3030
}
3131
],
3232
"links": {
33-
"first": "?page=1&per_page=1",
34-
"prev": "?page=2&per_page=1",
35-
"next": "?page=4&per_page=1",
36-
"last": "?page=13&per_page=1"
33+
"first": "http://example.com/articles?page=1&per_page=1",
34+
"prev": "http://example.com/articles?page=2&per_page=1",
35+
"next": "http://example.com/articles?page=4&per_page=1",
36+
"last": "http://example.com/articles?page=13&per_page=1"
3737
}
3838
}
3939
```

lib/action_controller/serialization.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ def get_serializer(resource, options = {})
2525
"Please pass 'adapter: false' or see ActiveSupport::SerializableResource#serialize"
2626
options[:adapter] = false
2727
end
28+
options[:original_url] = original_url
2829
ActiveModel::SerializableResource.serialize(resource, options) do |serializable_resource|
2930
if serializable_resource.serializer?
3031
serializable_resource.serialization_scope ||= serialization_scope
@@ -57,5 +58,9 @@ def serialization_scope(scope)
5758
self._serialization_scope = scope
5859
end
5960
end
61+
62+
def original_url
63+
request.original_url.sub(/\?.*$/, "")
64+
end
6065
end
6166
end

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def serializable_hash(options = nil)
2929
end
3030
end
3131

32-
include_pagination_links if serializer.pagination
32+
include_pagination_links if serializer.options[:pagination]
3333
else
3434
@hash[:data] = attributes_for_serializer(serializer, options)
3535
add_resource_relationships(@hash[:data], serializer)
@@ -168,7 +168,7 @@ def include_pagination_links
168168
end
169169

170170
def page_links
171-
@links ||= JsonApi::PaginationLinks.new(serializer.resource).page_links
171+
@links ||= JsonApi::PaginationLinks.new(serializer.resource, serializer.options).page_links
172172
end
173173

174174
def links?

lib/active_model/serializer/adapter/json_api/pagination_links.rb

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ class JsonApi < Adapter
55
class PaginationLinks
66
FIRST_PAGE = 1
77

8-
attr_reader :collection
8+
attr_reader :collection, :options
99

10-
def initialize(collection)
10+
def initialize(collection, options={})
1111
raise_unless_any_gem_installed
1212
@collection = collection
13+
@options = options
1314
end
1415

1516
def page_links
@@ -20,7 +21,7 @@ def page_links
2021

2122
def build_links
2223
pages_from.each_with_object({}) do |(key, value), hash|
23-
hash[key] = "?page=#{value}&per_page=#{collection.size}"
24+
hash[key] = "#{url}?page=#{value}&per_page=#{collection.size}"
2425
end
2526
end
2627

@@ -45,6 +46,15 @@ def raise_unless_any_gem_installed
4546
raise "AMS relies on either Kaminari or WillPaginate." +
4647
"Please install either dependency by adding one of those to your Gemfile"
4748
end
49+
50+
def url
51+
return default_url unless options && options[:links] && options[:links][:self]
52+
options[:links][:self]
53+
end
54+
55+
def default_url
56+
options[:original_url]
57+
end
4858
end
4959
end
5060
end

lib/active_model/serializer/array_serializer.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ class ArraySerializer
55
include Enumerable
66
delegate :each, to: :@objects
77

8-
attr_reader :root, :meta, :meta_key, :pagination, :resource
8+
attr_reader :root, :meta, :meta_key, :options, :resource
99

1010
def initialize(objects, options = {})
1111
@root = options[:root]
@@ -24,7 +24,7 @@ def initialize(objects, options = {})
2424
end
2525
@meta = options[:meta]
2626
@meta_key = options[:meta_key]
27-
@pagination = options[:pagination]
27+
@options = options
2828
end
2929

3030
def json_key

test/action_controller/json_api/pagination_test.rb

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,37 @@ def render_array_omitting_pagination_options
4747
tests PaginationTestController
4848

4949
def test_render_pagination_links_with_will_paginate
50-
expected_links = {"first"=>"?page=1&per_page=1", "prev"=>"?page=1&per_page=1", "next"=>"?page=3&per_page=1", "last"=>"?page=3&per_page=1"}
50+
expected_links = {"first"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate?page=1&per_page=1",
51+
"prev"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate?page=1&per_page=1",
52+
"next"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate?page=3&per_page=1",
53+
"last"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate?page=3&per_page=1"}
5154

5255
get :render_pagination_using_will_paginate, page: 2, per_page: 1
5356
response = JSON.parse(@response.body)
5457
assert_equal expected_links, response['links']
5558
end
5659

5760
def test_render_only_last_and_next_pagination_links
58-
expected_links = {"next"=>"?page=2&per_page=2", "last"=>"?page=2&per_page=2"}
61+
expected_links = {"next"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate?page=2&per_page=2",
62+
"last"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_will_paginate?page=2&per_page=2"}
5963
get :render_pagination_using_will_paginate, page: 1, per_page: 2
6064
response = JSON.parse(@response.body)
6165
assert_equal expected_links, response['links']
6266
end
6367

6468
def test_render_pagination_links_with_kaminari
65-
expected_links = {"first"=>"?page=1&per_page=1", "prev"=>"?page=1&per_page=1", "next"=>"?page=3&per_page=1", "last"=>"?page=3&per_page=1"}
69+
expected_links = {"first"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari?page=1&per_page=1",
70+
"prev"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari?page=1&per_page=1",
71+
"next"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari?page=3&per_page=1",
72+
"last"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari?page=3&per_page=1"}
6673
get :render_pagination_using_kaminari, page: 2, per_page: 1
6774
response = JSON.parse(@response.body)
6875
assert_equal expected_links, response['links']
6976
end
7077

7178
def test_render_only_prev_and_first_pagination_links
72-
expected_links = {"first"=>"?page=1&per_page=1", "prev"=>"?page=2&per_page=1"}
79+
expected_links = {"first"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari?page=1&per_page=1",
80+
"prev"=>"http://test.host/action_controller/serialization/json_api/pagination_test/pagination_test/render_pagination_using_kaminari?page=2&per_page=1"}
7381
get :render_pagination_using_kaminari, page: 3, per_page: 1
7482
response = JSON.parse(@response.body)
7583
assert_equal expected_links, response['links']

test/action_controller/serialization_test.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,9 @@ def test_warn_overridding_use_adapter_as_falsy_on_controller_instance
404404
def use_adapter?
405405
false
406406
end
407+
def original_url
408+
"http://example.com/"
409+
end
407410
}.new
408411
assert_match /adapter: false/, (capture(:stderr) {
409412
controller.get_serializer(Profile.new)
@@ -415,6 +418,9 @@ def test_dont_warn_overridding_use_adapter_as_truthy_on_controller_instance
415418
def use_adapter?
416419
true
417420
end
421+
def original_url
422+
"http://example.com/"
423+
end
418424
}.new
419425
assert_equal "", (capture(:stderr) {
420426
controller.get_serializer(Profile.new)

test/array_serializer_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def test_json_key_with_root_and_no_serializers
9595

9696
def test_pagination_attr_readers
9797
serializer = ArraySerializer.new(@resource, pagination: true)
98-
assert_equal serializer.pagination, true
98+
assert_equal serializer.options[:pagination], true
9999
end
100100

101101
def test_resource

0 commit comments

Comments
 (0)