Skip to content

Commit 83f9e74

Browse files
committed
send whole request context to model serializer
1 parent 5031eb9 commit 83f9e74

File tree

4 files changed

+45
-41
lines changed

4 files changed

+45
-41
lines changed

lib/action_controller/serialization.rb

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ def get_serializer(resource, options = {})
2525
"Please pass 'adapter: false' or see ActiveSupport::SerializableResource#serialize"
2626
options[:adapter] = false
2727
end
28-
if resource.respond_to?(:current_page) && resource.respond_to?(:total_pages)
29-
options[:pagination] = {}
30-
options[:pagination][:original_url] = original_url
31-
options[:pagination][:query_parameters] = query_parameters
32-
end
3328
ActiveModel::SerializableResource.serialize(resource, options) do |serializable_resource|
3429
if serializable_resource.serializer?
3530
serializable_resource.serialization_scope ||= serialization_scope
@@ -52,6 +47,7 @@ def use_adapter?
5247

5348
[:_render_option_json, :_render_with_renderer_json].each do |renderer_method|
5449
define_method renderer_method do |resource, options|
50+
options.fetch(:context) { options[:context] = request }
5551
serializable_resource = get_serializer(resource, options)
5652
super(serializable_resource, options)
5753
end
@@ -62,13 +58,5 @@ def serialization_scope(scope)
6258
self._serialization_scope = scope
6359
end
6460
end
65-
66-
def original_url
67-
request.original_url[/\A[^?]+/]
68-
end
69-
70-
def query_parameters
71-
request.query_parameters
72-
end
7361
end
7462
end

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,18 @@ def add_resource_relationships(attrs, serializer, options = {})
164164
def add_links(options)
165165
links = @hash.fetch(:links) { {} }
166166
resources = serializer.instance_variable_get(:@resource)
167-
@hash[:links] = add_pagination_links(links, resources, options) if options[:pagination]
167+
@hash[:links] = add_pagination_links(links, resources, options) if is_paginated?(resources)
168168
end
169169

170170
def add_pagination_links(links, resources, options)
171-
links.update(JsonApi::PaginationLinks.new(resources).serializable_hash(options))
171+
pagination_links = JsonApi::PaginationLinks.new(resources, options[:context]).serializable_hash(options)
172+
links.update(pagination_links)
173+
end
174+
175+
def is_paginated?(resource)
176+
resource.respond_to?(:current_page) &&
177+
resource.respond_to?(:total_pages) &&
178+
resource.respond_to?(:size)
172179
end
173180
end
174181
end

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

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

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

10-
def initialize(collection)
11-
raise_unless_any_gem_installed
10+
def initialize(collection, context)
1211
@collection = collection
12+
@context = context
1313
end
1414

1515
def serializable_hash(options = {})
1616
pages_from.each_with_object({}) do |(key, value), hash|
17-
query_parameters = options[:pagination].fetch(:query_parameters) { {} }
1817
params = query_parameters.merge(page: { number: value, size: collection.size }).to_query
1918

2019
hash[key] = "#{url(options)}?#{params}"
@@ -41,17 +40,17 @@ def pages_from
4140
end
4241
end
4342

44-
def raise_unless_any_gem_installed
45-
return if defined?(WillPaginate) || defined?(Kaminari)
46-
raise <<-EOF
47-
AMS relies on either Kaminari or WillPaginate for pagination.
48-
Please install either dependency by adding one of those to your Gemfile.
49-
EOF
50-
end
51-
5243
def url(options)
5344
self_link = options.fetch(:links) {{}}
54-
self_link.fetch(:self) {} ? options[:links][:self] : options[:pagination][:original_url]
45+
self_link.fetch(:self) {} ? options[:links][:self] : original_url
46+
end
47+
48+
def original_url
49+
@original_url ||= context.original_url[/\A[^?]+/]
50+
end
51+
52+
def query_parameters
53+
@query_parameters ||= context.query_parameters
5554
end
5655
end
5756
end

test/adapter/json_api/pagination_links_test.rb

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ class Serializer
99
class Adapter
1010
class JsonApi
1111
class PaginationLinksTest < Minitest::Test
12+
URI = 'http://example.com'
13+
1214
def setup
1315
ActionController::Base.cache_store.clear
1416
@array = [
@@ -18,6 +20,14 @@ def setup
1820
]
1921
end
2022

23+
def mock_request(query_parameters={}, original_url=URI)
24+
context = Minitest::Mock.new
25+
context.expect(:original_url, original_url )
26+
context.expect(:query_parameters, query_parameters)
27+
@options = {}
28+
@options[:context] = context
29+
end
30+
2131
def using_kaminari
2232
Kaminari.paginate_array(@array).page(2).per(1)
2333
end
@@ -38,11 +48,11 @@ def data
3848
def links
3949
{
4050
links:{
41-
self: "http://example.com?page%5Bnumber%5D=2&page%5Bsize%5D=1",
42-
first: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1",
43-
prev: "http://example.com?page%5Bnumber%5D=1&page%5Bsize%5D=1",
44-
next: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1",
45-
last: "http://example.com?page%5Bnumber%5D=3&page%5Bsize%5D=1"
51+
self: "#{URI}?page%5Bnumber%5D=2&page%5Bsize%5D=1",
52+
first: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
53+
prev: "#{URI}?page%5Bnumber%5D=1&page%5Bsize%5D=1",
54+
next: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1",
55+
last: "#{URI}?page%5Bnumber%5D=3&page%5Bsize%5D=1"
4656
}
4757
}
4858
end
@@ -59,7 +69,7 @@ def expected_response_with_pagination_links
5969
end
6070

6171
def expected_response_with_pagination_links_and_additional_params
62-
new_links = links[:links].each_with_object({}) {|(key, value), hash| hash[key] = "#{value}&teste=teste" }
72+
new_links = links[:links].each_with_object({}) {|(key, value), hash| hash[key] = "#{value}&test=test" }
6373
{}.tap do |hash|
6474
hash[:data] = [data.values.flatten.second]
6575
hash.merge! links: new_links
@@ -70,25 +80,25 @@ def test_pagination_links_using_kaminari
7080
serializer = ArraySerializer.new(using_kaminari)
7181
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
7282

73-
assert_equal expected_response_with_pagination_links,
74-
adapter.serializable_hash(pagination: { original_url: "http://example.com" })
83+
mock_request
84+
assert_equal expected_response_with_pagination_links, adapter.serializable_hash(@options)
7585
end
7686

7787
def test_pagination_links_using_will_paginate
7888
serializer = ArraySerializer.new(using_will_paginate)
7989
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
8090

81-
assert_equal expected_response_with_pagination_links,
82-
adapter.serializable_hash(pagination: { original_url: "http://example.com" })
91+
mock_request
92+
assert_equal expected_response_with_pagination_links, adapter.serializable_hash(@options)
8393
end
8494

8595
def test_pagination_links_with_additional_params
8696
serializer = ArraySerializer.new(using_will_paginate)
8797
adapter = ActiveModel::Serializer::Adapter::JsonApi.new(serializer)
88-
assert_equal expected_response_with_pagination_links_and_additional_params,
89-
adapter.serializable_hash(pagination: { original_url: "http://example.com",
90-
query_parameters: { teste: "teste"}})
9198

99+
mock_request({ test: 'test' })
100+
assert_equal expected_response_with_pagination_links_and_additional_params,
101+
adapter.serializable_hash(@options)
92102
end
93103

94104
def test_not_showing_pagination_links

0 commit comments

Comments
 (0)