array serializer uses root option for json_key if available

This commit is contained in:
vyrak bunleang 2015-07-16 15:24:50 -06:00
parent 1d31096600
commit 1b09d0ec42
2 changed files with 57 additions and 20 deletions

View File

@ -5,9 +5,10 @@ module ActiveModel
include Enumerable include Enumerable
delegate :each, to: :@objects delegate :each, to: :@objects
attr_reader :meta, :meta_key attr_reader :root, :meta, :meta_key
def initialize(objects, options = {}) def initialize(objects, options = {})
@root = options[:root]
@resource = objects @resource = objects
@objects = objects.map do |object| @objects = objects.map do |object|
serializer_class = options.fetch( serializer_class = options.fetch(
@ -26,15 +27,8 @@ module ActiveModel
end end
def json_key def json_key
if @objects.first key = root || @objects.first.try(:json_key) || @resource.try(:name).try(:underscore)
@objects.first.json_key.pluralize key.try(:pluralize)
else
@resource.name.underscore.pluralize if @resource.try(:name)
end
end
def root=(root)
@objects.first.root = root if @objects.first
end end
end end
end end

View File

@ -6,7 +6,13 @@ module ActiveModel
def setup def setup
@comment = Comment.new @comment = Comment.new
@post = Post.new @post = Post.new
@serializer = ArraySerializer.new([@comment, @post], {some: :options}) @resource = build_named_collection @comment, @post
@serializer = ArraySerializer.new(@resource, {some: :options})
end
def build_named_collection(*resource)
resource.define_singleton_method(:name){ 'MeResource' }
resource
end end
def test_respond_to_each def test_respond_to_each
@ -39,15 +45,52 @@ module ActiveModel
assert_equal @serializer.meta_key, "the meta key" assert_equal @serializer.meta_key, "the meta key"
end end
def test_json_key_when_resource_is_empty def test_root_default
Array.class_eval do @serializer = ArraySerializer.new([@comment, @post])
def name assert_equal @serializer.root, nil
'PostComment' end
end
end def test_root
@post_comments = [] expected = 'custom_root'
@serializer = ArraySerializer.new(@post_comments) @serializer = ArraySerializer.new([@comment, @post], root: expected)
assert_equal @serializer.json_key, "post_comments" assert_equal @serializer.root, expected
end
def test_root_with_no_serializers
expected = 'custom_root'
@serializer = ArraySerializer.new([], root: expected)
assert_equal @serializer.root, expected
end
def test_json_key
assert_equal @serializer.json_key, 'comments'
end
def test_json_key_with_resource_with_name_and_no_serializers
serializer = ArraySerializer.new(build_named_collection)
assert_equal serializer.json_key, 'me_resources'
end
def test_json_key_with_resource_with_nil_name_and_no_serializers
resource = []
resource.define_singleton_method(:name){ nil }
serializer = ArraySerializer.new(resource)
assert_equal serializer.json_key, nil
end
def test_json_key_with_resource_without_name_and_no_serializers
serializer = ArraySerializer.new([])
assert_equal serializer.json_key, nil
end
def test_json_key_with_root
serializer = ArraySerializer.new(@resource, root: 'custom_root')
assert_equal serializer.json_key, 'custom_roots'
end
def test_json_key_with_root_and_no_serializers
serializer = ArraySerializer.new(build_named_collection, root: 'custom_root')
assert_equal serializer.json_key, 'custom_roots'
end end
end end
end end