diff --git a/lib/active_model/serializer/adapter/json.rb b/lib/active_model/serializer/adapter/json.rb index 68dba220..970de04b 100644 --- a/lib/active_model/serializer/adapter/json.rb +++ b/lib/active_model/serializer/adapter/json.rb @@ -3,9 +3,16 @@ module ActiveModel class Adapter class Json < Adapter def serializable_hash(options = {}) - serializer.attributes.each_with_object({}) do |(attr, value), h| - h[attr] = value + @hash = serializer.attributes + + serializer.associations.each do |name, association| + if association.respond_to?(:each) + @hash[name] = association.map(&:attributes) + else + @hash[name] = association.attributes + end end + @hash end end end diff --git a/test/adapter/json/belongs_to_test.rb b/test/adapter/json/belongs_to_test.rb new file mode 100644 index 00000000..498f1d98 --- /dev/null +++ b/test/adapter/json/belongs_to_test.rb @@ -0,0 +1,25 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class Adapter + class Json + class BelongsToTest < Minitest::Test + def setup + @post = Post.new(id: 42, title: 'New Post', body: 'Body') + @comment = Comment.new(id: 1, body: 'ZOMG A COMMENT') + @post.comments = [@comment] + @comment.post = @post + + @serializer = CommentSerializer.new(@comment) + @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer) + end + + def test_includes_post + assert_equal({id: 42, title: 'New Post', body: 'Body'}, @adapter.serializable_hash[:post]) + end + end + end + end + end +end diff --git a/test/adapter/json/has_many_test.rb b/test/adapter/json/has_many_test.rb new file mode 100644 index 00000000..d1534e6b --- /dev/null +++ b/test/adapter/json/has_many_test.rb @@ -0,0 +1,31 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class Adapter + class Json + class HasManyTestTest < Minitest::Test + def setup + @post = Post.new(title: 'New Post', body: 'Body') + @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT') + @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT') + @post.comments = [@first_comment, @second_comment] + @first_comment.post = @post + @second_comment.post = @post + + @serializer = PostSerializer.new(@post) + @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer) + end + + def test_has_many + assert_equal([ + {id: 1, body: 'ZOMG A COMMENT'}, + {id: 2, body: 'ZOMG ANOTHER COMMENT'} + ], @adapter.serializable_hash[:comments]) + end + end + end + end + end +end + diff --git a/test/adapter/json_api/has_many.rb b/test/adapter/json_api/has_many.rb index ad8c3c2f..435079d7 100644 --- a/test/adapter/json_api/has_many.rb +++ b/test/adapter/json_api/has_many.rb @@ -14,7 +14,7 @@ module ActiveModel @second_comment.post = @post @serializer = PostSerializer.new(@post) - @adapter = ActiveModel::Serializer::Adapter::JsonApiAdapter.new(@serializer) + @adapter = ActiveModel::Serializer::Adapter::JsonApi.new(@serializer) end def test_includes_comment_ids diff --git a/test/adapter/json_test.rb b/test/adapter/json_test.rb index f8e753da..1d2e35a6 100644 --- a/test/adapter/json_test.rb +++ b/test/adapter/json_test.rb @@ -3,23 +3,24 @@ require 'test_helper' module ActiveModel class Serializer class Adapter - class JsonAdapterTest < Minitest::Test + class JsonTest < Minitest::Test def setup - @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) - @profile_serializer = ProfileSerializer.new(@profile) + @post = Post.new(title: 'New Post', body: 'Body') + @first_comment = Comment.new(id: 1, body: 'ZOMG A COMMENT') + @second_comment = Comment.new(id: 2, body: 'ZOMG ANOTHER COMMENT') + @post.comments = [@first_comment, @second_comment] + @first_comment.post = @post + @second_comment.post = @post - @adapter = Json.new(@profile_serializer) + @serializer = PostSerializer.new(@post) + @adapter = ActiveModel::Serializer::Adapter::Json.new(@serializer) end - def test_serializable_hash - assert_equal({name: 'Name 1', description: 'Description 1'}, @adapter.serializable_hash) - end - - def test_simple_adapter - assert_equal('{"name":"Name 1","description":"Description 1"}', - @adapter.to_json) - -JSON + def test_has_many + assert_equal([ + {id: 1, body: 'ZOMG A COMMENT'}, + {id: 2, body: 'ZOMG ANOTHER COMMENT'} + ], @adapter.serializable_hash[:comments]) end end end