diff --git a/lib/active_model/serializer/associations.rb b/lib/active_model/serializer/associations.rb index 8606b930e..1a08bfa9d 100644 --- a/lib/active_model/serializer/associations.rb +++ b/lib/active_model/serializer/associations.rb @@ -48,7 +48,13 @@ def option(key, default=nil) def target_serializer serializer = option(:serializer) - serializer.is_a?(String) ? serializer.constantize : serializer + if serializer.is_a?(String) + serializer.constantize + elsif serializer.is_a?(Symbol) + source_serializer.send(serializer) + else + serializer + end end def source_serializer diff --git a/test/association_test.rb b/test/association_test.rb index 2cfbd961d..6fa692755 100644 --- a/test/association_test.rb +++ b/test/association_test.rb @@ -589,4 +589,30 @@ def test_specifying_serializer_class_as_string assert_equal({}, @root_hash) end end + + class SymbolSerializerOption < AssociationTest + class SymbolSerializer < ActiveModel::Serializer + attributes :id + end + + def test_specifying_serializer_class_as_a_symbol + @post_serializer_class.class_eval do + has_many :comments, :embed => :objects + + def conditional_searializer + AssociationTest::SymbolSerializerOption::SymbolSerializer + end + end + + include_bare! :comments, :serializer => :conditional_searializer + + assert_equal({ + :comments => [ + { :id => 1 } + ] + }, @hash) + + assert_equal({}, @root_hash) + end + end end