From d8b78a36cfde1bef6dc23c6a64f6b92c4597258d Mon Sep 17 00:00:00 2001 From: Jacek Tomaszewski Date: Wed, 19 Feb 2014 15:48:52 +0100 Subject: [PATCH] Allow to define custom serializer for given class .. by defining #serializer_class method in serialized object's class. Resolves #515. --- lib/active_model/serializer.rb | 4 +++- .../array_serializer/serialization_test.rb | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index cceba3f4e..4579fed0e 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -56,7 +56,9 @@ def format_keys(format) attr_reader :key_format def serializer_for(resource, options = {}) - if resource.respond_to?(:to_ary) + if resource.respond_to?(:serializer_class) + resource.serializer_class + elsif resource.respond_to?(:to_ary) if Object.constants.include?(:ArraySerializer) ::ArraySerializer else diff --git a/test/unit/active_model/array_serializer/serialization_test.rb b/test/unit/active_model/array_serializer/serialization_test.rb index 4d3a71dcb..890e7a09a 100644 --- a/test/unit/active_model/array_serializer/serialization_test.rb +++ b/test/unit/active_model/array_serializer/serialization_test.rb @@ -35,6 +35,23 @@ def test_serializer_for_array_returns_appropriate_type end end + class CustomSerializerClassTest < Minitest::Test + def setup + Object.const_set(:CustomSerializer, Class.new) + end + + def teardown + Object.send(:remove_const, :CustomSerializer) + end + + def test_serializer_for_array_returns_appropriate_type + object = {} + def object.serializer_class; CustomSerializer; end + + assert_equal CustomSerializer, Serializer.serializer_for(object) + end + end + class ModelSerializationTest < Minitest::Test def test_array_serializer_serializes_models array = [Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }),