Skip to content

Commit 2839434

Browse files
committed
Add config.serializer_lookup_enabled that defaults true
1 parent 47a14b6 commit 2839434

File tree

7 files changed

+54
-10
lines changed

7 files changed

+54
-10
lines changed

CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ Features:
2121
- [#1127](https://github.com/rails-api/active_model_serializers/pull/1127) Add support for nested
2222
associations for JSON and Attributes adapters via the `include` option (@NullVoxPopuli, @beauby).
2323
- [#1050](https://github.com/rails-api/active_model_serializers/pull/1050) Add support for toplevel jsonapi member (@beauby, @bf4)
24-
- [#tbd](https://github.com/rails-api/active_model_serializers/pull/tbd) Rename ArraySerializer to
24+
- [#1251](https://github.com/rails-api/active_model_serializers/pull/1251) Rename ArraySerializer to
2525
CollectionSerializer for clarity, add ActiveModelSerializers.config.collection_serializer (@bf4)
26+
- [#1295](https://github.com/rails-api/active_model_serializers/pull/1295) Add config `serializer_lookup_enabled` that,
27+
when disabled, requires serializers to explicitly specified. (@trek)
2628

2729
Fixes:
2830
- [#1239](https://github.com/rails-api/active_model_serializers/pull/1239) Fix duplicates in JSON API compound documents (@beauby)

docs/general/configuration_options.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ The following configuration options can be set on `ActiveModel::Serializer.confi
55
## General
66

77
- `adapter`: The [adapter](adapters.md) to use. Possible values: `:attributes, :json, :json_api`. Default: `:attributes`.
8-
- `automatic_lookup`: Whether serializer should be automatically looked up or manually provided. Default: `true`
8+
- `serializer_lookup_enabled`: When `false`, serializers must be explicitly specified. Default: `true`
99

1010
## JSON API
1111

lib/action_controller/serialization.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,6 @@ def serialization_scope
2727
end
2828

2929
def get_serializer(resource, options = {})
30-
unless options[:serializer] || options[:each_serializer] || ActiveModel::Serializer.config.automatic_lookup
31-
return resource
32-
end
33-
3430
if !use_adapter?
3531
warn 'ActionController::Serialization#use_adapter? has been removed. '\
3632
"Please pass 'adapter: false' or see ActiveSupport::SerializableResource.new"

lib/active_model/serializer.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ def self.serializer_lookup_chain_for(klass)
208208
# 2. try again with superclass, if present
209209
# 3. nil
210210
def self.get_serializer_for(klass)
211+
return nil unless config.serializer_lookup_enabled
211212
serializers_cache.fetch_or_store(klass) do
212213
# NOTE(beauby): When we drop 1.9.3 support we can lazify the map for perfs.
213214
serializer_class = serializer_lookup_chain_for(klass).map(&:safe_constantize).find { |x| x && x < ActiveModel::Serializer }

lib/active_model/serializer/configuration.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ module Configuration
99
included do |base|
1010
config = base.config
1111
config.collection_serializer = ActiveModel::Serializer::CollectionSerializer
12+
config.serializer_lookup_enabled = true
1213

1314
def config.array_serializer=(collection_serializer)
1415
self.collection_serializer = collection_serializer
@@ -20,7 +21,6 @@ def config.array_serializer
2021

2122
config.adapter = :attributes
2223
config.jsonapi_resource_type = :plural
23-
config.automatic_lookup = true
2424
end
2525
end
2626
end

test/serializers/serializer_for_test.rb

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,14 +57,21 @@ def setup
5757

5858
def test_serializer_for_non_ams_serializer
5959
serializer = ActiveModel::Serializer.serializer_for(@tweet)
60-
assert_nil(serializer)
60+
assert_equal nil, serializer
6161
end
6262

6363
def test_serializer_for_existing_serializer
6464
serializer = ActiveModel::Serializer.serializer_for(@profile)
6565
assert_equal ProfileSerializer, serializer
6666
end
6767

68+
def test_serializer_for_existing_serializer_with_lookup_disabled
69+
serializer = with_serializer_lookup_disabled do
70+
ActiveModel::Serializer.serializer_for(@profile)
71+
end
72+
assert_equal nil, serializer
73+
end
74+
6875
def test_serializer_for_not_existing_serializer
6976
serializer = ActiveModel::Serializer.serializer_for(@model)
7077
assert_equal nil, serializer
@@ -75,21 +82,51 @@ def test_serializer_inherited_serializer
7582
assert_equal ProfileSerializer, serializer
7683
end
7784

85+
def test_serializer_inherited_serializer_with_lookup_disabled
86+
serializer = with_serializer_lookup_disabled do
87+
ActiveModel::Serializer.serializer_for(@my_profile)
88+
end
89+
assert_equal nil, serializer
90+
end
91+
7892
def test_serializer_custom_serializer
7993
serializer = ActiveModel::Serializer.serializer_for(@custom_profile)
8094
assert_equal ProfileSerializer, serializer
8195
end
8296

97+
def test_serializer_custom_serializer_with_lookup_disabled
98+
serializer = with_serializer_lookup_disabled do
99+
ActiveModel::Serializer.serializer_for(@custom_profile)
100+
end
101+
assert_equal ProfileSerializer, serializer
102+
end
103+
83104
def test_serializer_for_namespaced_resource
84105
post = ResourceNamespace::Post.new
85106
serializer = ActiveModel::Serializer.serializer_for(post)
86-
assert_equal(ResourceNamespace::PostSerializer, serializer)
107+
assert_equal ResourceNamespace::PostSerializer, serializer
108+
end
109+
110+
def test_serializer_for_namespaced_resource_with_lookup_disabled
111+
post = ResourceNamespace::Post.new
112+
serializer = with_serializer_lookup_disabled do
113+
ActiveModel::Serializer.serializer_for(post)
114+
end
115+
assert_equal nil, serializer
87116
end
88117

89118
def test_serializer_for_nested_resource
90119
comment = ResourceNamespace::Comment.new
91120
serializer = ResourceNamespace::PostSerializer.serializer_for(comment)
92-
assert_equal(ResourceNamespace::PostSerializer::CommentSerializer, serializer)
121+
assert_equal ResourceNamespace::PostSerializer::CommentSerializer, serializer
122+
end
123+
124+
def test_serializer_for_nested_resource_with_lookup_disabled
125+
comment = ResourceNamespace::Comment.new
126+
serializer = with_serializer_lookup_disabled do
127+
ResourceNamespace::PostSerializer.serializer_for(comment)
128+
end
129+
assert_equal nil, serializer
93130
end
94131
end
95132
end

test/support/serialization_testing.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ def with_config(hash)
3131
ActiveModel::Serializer.config.replace(old_config)
3232
end
3333

34+
def with_serializer_lookup_disabled
35+
original_serializer_lookup = ActiveModelSerializers.config.serializer_lookup_enabled
36+
ActiveModelSerializers.config.serializer_lookup_enabled = false
37+
yield
38+
ensure
39+
ActiveModelSerializers.config.serializer_lookup_enabled = original_serializer_lookup
40+
end
41+
3442
def serializable(resource, options = {})
3543
ActiveModel::SerializableResource.new(resource, options)
3644
end

0 commit comments

Comments
 (0)