mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-23 06:16:50 +00:00
Merge pull request #94 from teeparham/array-serializer-root
Add root option to ArraySerializer
This commit is contained in:
commit
ef7d475912
@ -40,13 +40,17 @@ module ActionController
|
|||||||
end
|
end
|
||||||
|
|
||||||
def _render_option_json(json, options)
|
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) ||
|
serializer = options.delete(:serializer) ||
|
||||||
(json.respond_to?(:active_model_serializer) && json.active_model_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
|
if serializer
|
||||||
options[:scope] = serialization_scope
|
options[:scope] = serialization_scope
|
||||||
options[:url_options] = url_options
|
options[:url_options] = url_options
|
||||||
|
|||||||
@ -29,11 +29,18 @@ module ActiveModel
|
|||||||
|
|
||||||
# Active Model Array Serializer
|
# 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.
|
# the +active_model_serializer+ method.
|
||||||
|
#
|
||||||
|
# To disable serialization of root elements, in an initializer:
|
||||||
|
#
|
||||||
|
# ActiveModel::ArraySerializer.root = false
|
||||||
|
#
|
||||||
class ArraySerializer
|
class ArraySerializer
|
||||||
attr_reader :object, :options
|
attr_reader :object, :options
|
||||||
|
|
||||||
|
class_attribute :root
|
||||||
|
|
||||||
def initialize(object, options={})
|
def initialize(object, options={})
|
||||||
@object, @options = object, options
|
@object, @options = object, options
|
||||||
end
|
end
|
||||||
|
|||||||
@ -66,6 +66,10 @@ class RenderJsonTest < ActionController::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class CustomArraySerializer < ActiveModel::ArraySerializer
|
||||||
|
self.root = "items"
|
||||||
|
end
|
||||||
|
|
||||||
class TestController < ActionController::Base
|
class TestController < ActionController::Base
|
||||||
protect_from_forgery
|
protect_from_forgery
|
||||||
|
|
||||||
@ -132,8 +136,14 @@ class RenderJsonTest < ActionController::TestCase
|
|||||||
render :json => JsonSerializable.new(true)
|
render :json => JsonSerializable.new(true)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# To specify a custom serializer for an object, use :serializer.
|
||||||
def render_json_with_custom_serializer
|
def render_json_with_custom_serializer
|
||||||
render :json => [], :serializer => CustomSerializer
|
render :json => Object.new, :serializer => CustomSerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
# To specify a custom serializer for each item in the Array, use :each_serializer.
|
||||||
|
def render_json_array_with_custom_serializer
|
||||||
|
render :json => [Object.new], :each_serializer => CustomSerializer
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_json_with_links
|
def render_json_with_links
|
||||||
@ -144,6 +154,14 @@ class RenderJsonTest < ActionController::TestCase
|
|||||||
render :json => [], :root => false
|
render :json => [], :root => false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def render_json_empty_array
|
||||||
|
render :json => []
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_json_array_with_custom_array_serializer
|
||||||
|
render :json => [], :serializer => CustomArraySerializer
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
private
|
private
|
||||||
def default_serializer_options
|
def default_serializer_options
|
||||||
@ -251,6 +269,11 @@ class RenderJsonTest < ActionController::TestCase
|
|||||||
assert_match '{"hello":true}', @response.body
|
assert_match '{"hello":true}', @response.body
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_render_json_array_with_custom_serializer
|
||||||
|
get :render_json_array_with_custom_serializer
|
||||||
|
assert_match '{"test":[{"hello":true}]}', @response.body
|
||||||
|
end
|
||||||
|
|
||||||
def test_render_json_with_links
|
def test_render_json_with_links
|
||||||
get :render_json_with_links
|
get :render_json_with_links
|
||||||
assert_match '{"link":"http://www.nextangle.com/hypermedia"}', @response.body
|
assert_match '{"link":"http://www.nextangle.com/hypermedia"}', @response.body
|
||||||
@ -260,4 +283,23 @@ class RenderJsonTest < ActionController::TestCase
|
|||||||
get :render_json_array_with_no_root
|
get :render_json_array_with_no_root
|
||||||
assert_equal '[]', @response.body
|
assert_equal '[]', @response.body
|
||||||
end
|
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
|
end
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user