From c91b649504e6cf8f2d24ed901425d89c7eb7051b Mon Sep 17 00:00:00 2001 From: Bernard Potocki Date: Sun, 3 May 2015 17:47:52 +0200 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 +++- test/serializers/serializer_for_test.rb | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 2abeebce..969fa308 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -115,7 +115,9 @@ module ActiveModel end def self.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) config.array_serializer else options diff --git a/test/serializers/serializer_for_test.rb b/test/serializers/serializer_for_test.rb index 5369c57b..1fd4c10e 100644 --- a/test/serializers/serializer_for_test.rb +++ b/test/serializers/serializer_for_test.rb @@ -29,10 +29,14 @@ module ActiveModel class SerializerTest < Minitest::Test class MyProfile < Profile end + class CustomProfile + def serializer_class; ProfileSerializer; end + end def setup @profile = Profile.new @my_profile = MyProfile.new + @custom_profile = CustomProfile.new @model = ::Model.new end @@ -50,6 +54,11 @@ module ActiveModel serializer = ActiveModel::Serializer.serializer_for(@my_profile) assert_equal ProfileSerializer, serializer end + + def test_serializer_custom_serializer + serializer = ActiveModel::Serializer.serializer_for(@custom_profile) + assert_equal ProfileSerializer, serializer + end end end end