Skip to content

Commit 5af8536

Browse files
committed
Merge pull request #1616 from bf4/more_controller_logic_to_serializable_resource
SerializableResource handles no serializer like controller
2 parents 5af7d96 + ec5dc49 commit 5af8536

File tree

6 files changed

+38
-16
lines changed

6 files changed

+38
-16
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
Breaking changes:
44

55
Features:
6+
- [#1616](https://github.com/rails-api/active_model_serializers/pull/1616) SerializableResource handles no serializer like controller. (@bf4)
67
- [#1618](https://github.com/rails-api/active_model_serializers/issues/1618) Get collection root key for
78
empty collection from explicit serializer option, when possible. (@bf4)
89
- [#1574](https://github.com/rails-api/active_model_serializers/pull/1574) Provide key translation. (@remear)

lib/action_controller/serialization.rb

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,12 @@ def get_serializer(resource, options = {})
3333
options[:adapter] = false
3434
end
3535
serializable_resource = ActiveModel::SerializableResource.new(resource, options)
36-
if serializable_resource.serializer?
37-
serializable_resource.serialization_scope ||= serialization_scope
38-
serializable_resource.serialization_scope_name = _serialization_scope
39-
begin
40-
# Necessary to ensure we have an adapter for the serializable resource
41-
# after it has been figured.
42-
# TODO: This logic should be less opaque and probably moved into the SerializableResource.
43-
serializable_resource.tap(&:adapter)
44-
rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError
45-
resource
46-
end
47-
else
48-
resource
49-
end
36+
serializable_resource.serialization_scope ||= serialization_scope
37+
serializable_resource.serialization_scope_name = _serialization_scope
38+
# For compatibility with the JSON renderer: `json.to_json(options) if json.is_a?(String)`.
39+
# Otherwise, since `serializable_resource` is not a string, the renderer would call
40+
# `to_json` on a String and given odd results, such as `"".to_json #=> '""'`
41+
serializable_resource.adapter.is_a?(String) ? serializable_resource.adapter : serializable_resource
5042
end
5143

5244
# Deprecated

lib/active_model/serializable_resource.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,19 @@ def serialization_scope_name=(scope_name)
3030
serializer_opts[:scope_name] = scope_name
3131
end
3232

33+
# NOTE: if no adapter is available, returns the resource itself. (i.e. adapter is a no-op)
3334
def adapter
34-
@adapter ||= ActiveModelSerializers::Adapter.create(serializer_instance, adapter_opts)
35+
@adapter ||= find_adapter
3536
end
3637
alias adapter_instance adapter
3738

39+
def find_adapter
40+
return resource unless serializer?
41+
ActiveModelSerializers::Adapter.create(serializer_instance, adapter_opts)
42+
rescue ActiveModel::Serializer::CollectionSerializer::NoSerializerError
43+
resource
44+
end
45+
3846
def serializer_instance
3947
@serializer_instance ||= serializer.new(resource, serializer_opts)
4048
end

lib/active_model/serializer.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ module ActiveModel
2020
class Serializer
2121
extend ActiveSupport::Autoload
2222
autoload :Adapter
23+
autoload :Null
2324
include Configuration
2425
include Associations
2526
include Attributes

lib/active_model/serializer/null.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
module ActiveModel
2+
class Serializer
3+
class Null < Serializer
4+
def attributes(*)
5+
{}
6+
end
7+
8+
def associations(*)
9+
{}
10+
end
11+
12+
def serializable_hash(*)
13+
{}
14+
end
15+
end
16+
end
17+
end

lib/active_model_serializers/logging.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ def notify_render(*)
8181
end
8282

8383
def notify_render_payload
84-
{ serializer: serializer, adapter: adapter }
84+
{
85+
serializer: serializer || ActiveModel::Serializer::Null,
86+
adapter: adapter || ActiveModelSerializers::Adapter::Null
87+
}
8588
end
8689

8790
private

0 commit comments

Comments
 (0)