add class attribute :root to ArraySerializer

You can now set the default behavior for Array serialization in a
single place
This commit is contained in:
Tee Parham 2012-07-14 21:44:23 -06:00
parent 56824f055b
commit 0832e42917
3 changed files with 47 additions and 5 deletions

View File

@ -40,13 +40,17 @@ module ActionController
end
def _render_option_json(json, options)
if json.respond_to?(:to_ary)
options[:root] ||= controller_name unless options[:root] == false
end
serializer = options.delete(:serializer) ||
(json.respond_to?(:active_model_serializer) && json.active_model_serializer)
if json.respond_to?(:to_ary)
if options[:root] != false && serializer.root != false
# default root element for arrays is serializer's root or the controller name
# the serializer for an Array is ActiveModel::ArraySerializer
options[:root] ||= serializer.root || controller_name
end
end
if serializer
options[:scope] = serialization_scope
options[:url_options] = url_options

View File

@ -29,11 +29,18 @@ module ActiveModel
# Active Model Array Serializer
#
# It serializes an array checking if each element that implements
# It serializes an Array, checking if each element that implements
# the +active_model_serializer+ method.
#
# To disable serialization of root elements, in an initializer:
#
# ActiveModel::ArraySerializer.root = false
#
class ArraySerializer
attr_reader :object, :options
class_attribute :root
def initialize(object, options={})
@object, @options = object, options
end

View File

@ -66,6 +66,10 @@ class RenderJsonTest < ActionController::TestCase
end
end
class CustomArraySerializer < ActiveModel::ArraySerializer
self.root = "items"
end
class TestController < ActionController::Base
protect_from_forgery
@ -144,6 +148,14 @@ class RenderJsonTest < ActionController::TestCase
render :json => [], :root => false
end
def render_json_empty_array
render :json => []
end
def render_json_array_with_custom_array_serializer
render :json => [], :serializer => CustomArraySerializer
end
private
def default_serializer_options
@ -260,4 +272,23 @@ class RenderJsonTest < ActionController::TestCase
get :render_json_array_with_no_root
assert_equal '[]', @response.body
end
def test_render_json_empty_array
get :render_json_empty_array
assert_equal '{"test":[]}', @response.body
end
def test_render_json_empty_arry_with_array_serializer_root_false
ActiveModel::ArraySerializer.root = false
get :render_json_empty_array
assert_equal '[]', @response.body
ensure # teardown
ActiveModel::ArraySerializer.root = nil
end
def test_render_json_array_with_custom_array_serializer
get :render_json_array_with_custom_array_serializer
assert_equal '{"items":[]}', @response.body
end
end