From 5598bb0f79fc35d4cd068ec0e18168057c6152c5 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Thu, 31 Oct 2013 16:51:57 -0200 Subject: [PATCH] Make Associations in root work with ArraySerializer Closes #414 --- lib/active_model/array_serializer.rb | 22 +++++++++++ .../action_controller/serialization_test.rb | 37 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index 6e5e077e..62f6e535 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -37,5 +37,27 @@ module ActiveModel end end alias_method :serializable_object, :serializable_array + + def serializable_data + embedded_in_root_associations.merge!(super) + end + + def embedded_in_root_associations + hash = {} + @object.map do |item| + serializer_class = @each_serializer || Serializer.serializer_for(item) || DefaultSerializer + associations = serializer_class._associations + serializer = serializer_class.new(item, @options) + included_associations = serializer.filter(associations.keys) + associations.each do |(name, association)| + if included_associations.include? name + if association.embed_in_root? + hash[association.embedded_key] = serializer.serialize association + end + end + end + end + hash + end end end diff --git a/test/integration/action_controller/serialization_test.rb b/test/integration/action_controller/serialization_test.rb index c790e4a0..7ffd4c56 100644 --- a/test/integration/action_controller/serialization_test.rb +++ b/test/integration/action_controller/serialization_test.rb @@ -193,5 +193,42 @@ module ActionController assert_equal '{"my":[{"name":"Name 1","description":"Description 1"}]}', @response.body end end + + class ArrayEmbedingSerializerTest < ActionController::TestCase + def setup + super + @association = UserSerializer._associations[:profile] + @old_association = @association.dup + end + + def teardown + super + UserSerializer._associations[:profile] = @old_association + end + + class MyController < ActionController::Base + def initialize(*) + super + @user = User.new({ name: 'Name 1', email: 'mail@server.com', gender: 'M' }) + end + attr_reader :user + + def render_array_embeding_in_root + render json: [@user] + end + end + + tests MyController + + def test_render_array_embeding_in_root + @association.embed = :ids + @association.embed_in_root = true + + get :render_array_embeding_in_root + assert_equal 'application/json', @response.content_type + + assert_equal("{\"my\":[{\"name\":\"Name 1\",\"email\":\"mail@server.com\",\"profile_id\":#{@controller.user.profile.object_id}}],\"profiles\":[{\"name\":\"N1\",\"description\":\"D1\"}]}", @response.body) + end + end end end