diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 05a79900e..0db799b08 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -66,8 +66,7 @@ def self.serializer_for(resource) if resource.respond_to?(:to_ary) config.array_serializer else - serializer_class = "#{resource.class.name}Serializer" - serializer_class.safe_constantize + get_serializer_for(resource.class) end end @@ -110,5 +109,19 @@ def each_association(&block) end end end + + private + + def self.get_serializer_for(klass) + serializer_class_name = "#{klass.name}Serializer" + serializer_class = serializer_class_name.safe_constantize + + if serializer_class + serializer_class + elsif klass.superclass + get_serializer_for(klass.superclass) + end + end + end end diff --git a/test/serializers/serializer_for_test.rb b/test/serializers/serializer_for_test.rb index 8dd9bd41e..5369c57b2 100644 --- a/test/serializers/serializer_for_test.rb +++ b/test/serializers/serializer_for_test.rb @@ -27,8 +27,12 @@ def test_overwritten_serializer_for_array end class SerializerTest < Minitest::Test + class MyProfile < Profile + end + def setup @profile = Profile.new + @my_profile = MyProfile.new @model = ::Model.new end @@ -41,6 +45,11 @@ def test_serializer_for_not_existing_serializer serializer = ActiveModel::Serializer.serializer_for(@model) assert_equal nil, serializer end + + def test_serializer_inherited_serializer + serializer = ActiveModel::Serializer.serializer_for(@my_profile) + assert_equal ProfileSerializer, serializer + end end end end