diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index ef68072c..474b2d9d 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -134,12 +134,9 @@ module ActiveModel class_eval "def #{attr}() object.#{attr} end", __FILE__, __LINE__ end - # if :key is specified without :serializer, then use conventions - # to determine the serializer - if options[:key] && !options[:serializer] - options[:serializer] = const_get("#{options[:key].to_s.camelize.singularize}Serializer") - else - options[:serializer] ||= const_get("#{attr.to_s.camelize}Serializer") + options[:serializer] ||= begin + serializer_class = (options[:key] || attr).to_s.classify + const_get("#{serializer_class}Serializer") end klass.new(attr, options) diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 3a65e1ab..b4e50161 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -211,6 +211,30 @@ class SerializerTest < ActiveModel::TestCase }, json) end + def test_implicit_serializer_for_has_many + blog_with_posts = Class.new(Blog) do + attr_accessor :posts + end + + blog_serializer = Class.new(ActiveModel::Serializer) do + const_set(:PostSerializer, PostSerializer) + has_many :posts + end + + user = User.new + blog = blog_with_posts.new + blog.posts = [Post.new(:title => 'test')] + + json = blog_serializer.new(blog, user).as_json + assert_equal({ + :posts => [{ + :title => "test", + :body => nil, + :comments => [] + }] + }, json) + end + def test_overridden_associations author_serializer = Class.new(ActiveModel::Serializer) do attributes :first_name