diff --git a/lib/active_model/array_serializer.rb b/lib/active_model/array_serializer.rb index ad5ce346..b3e67aa5 100644 --- a/lib/active_model/array_serializer.rb +++ b/lib/active_model/array_serializer.rb @@ -20,16 +20,13 @@ module ActiveModel @meta = options[@meta_key] @each_serializer = options[:each_serializer] @resource_name = options[:resource_name] - @key_format = options[:key_format] + @key_format = options[:key_format] || options[:each_serializer].try(:key_format) end attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format def json_key - if root.nil? - @resource_name - else - root - end + key = root.nil? ? @resource_name : root + key_format == :lower_camel ? key.camelize(:lower) : key end def serializer_for(item) diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index a2c832f9..f0244a6e 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -117,14 +117,16 @@ end @except = Array(options[:except]) if options[:except] @key_format = options[:key_format] end - attr_accessor :object, :scope, :root, :meta_key, :meta + attr_accessor :object, :scope, :root, :meta_key, :meta, :key_format def json_key - if root == true || root.nil? + key = if root == true || root.nil? self.class.root_name else root end + + key_format == :lower_camel ? key.camelize(:lower) : key end def attributes diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 6909ef2c..a357c24e 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -35,7 +35,7 @@ end class Comment < Model end -class Blog < Model +class WebLog < Model end ### @@ -66,10 +66,10 @@ class CommentSerializer < ActiveModel::Serializer attributes :content end -class BlogSerializer < ActiveModel::Serializer +class WebLogSerializer < ActiveModel::Serializer attributes :name, :display_name end -class BlogLowerCamelSerializer < BlogSerializer +class WebLogLowerCamelSerializer < WebLogSerializer format_keys :lower_camel end diff --git a/test/integration/action_controller/serialization_test.rb b/test/integration/action_controller/serialization_test.rb index 7ffd4c56..9065e211 100644 --- a/test/integration/action_controller/serialization_test.rb +++ b/test/integration/action_controller/serialization_test.rb @@ -194,6 +194,22 @@ module ActionController end end + class LowerCamelArraySerializerTest < ActionController::TestCase + class WebLogController < ActionController::Base + def render_array + render json: [WebLog.new({name: 'Name 1', display_name: 'Display Name 1'}), WebLog.new({name: 'Name 2', display_name: 'Display Name 2'})], each_serializer: WebLogLowerCamelSerializer + end + end + + tests WebLogController + + def test_render_array + get :render_array + assert_equal 'application/json', @response.content_type + assert_equal '{"webLog":[{"name":"Name 1","displayName":"Display Name 1"},{"name":"Name 2","displayName":"Display Name 2"}]}', @response.body + end + end + class ArrayEmbedingSerializerTest < ActionController::TestCase def setup super diff --git a/test/unit/active_model/array_serializer/key_format_test.rb b/test/unit/active_model/array_serializer/key_format_test.rb index 6ddd82b8..4c247bfd 100644 --- a/test/unit/active_model/array_serializer/key_format_test.rb +++ b/test/unit/active_model/array_serializer/key_format_test.rb @@ -4,8 +4,8 @@ module ActiveModel class ArraySerializer class KeyFormatTest < Minitest::Test def test_array_serializer_pass_options_to_items_serializers - array = [Blog.new({ name: 'Name 1', display_name: 'Display Name 1'}), - Blog.new({ name: 'Name 2', display_name: 'Display Name 2'})] + array = [WebLog.new({ name: 'Name 1', display_name: 'Display Name 1'}), + WebLog.new({ name: 'Name 2', display_name: 'Display Name 2'})] serializer = ArraySerializer.new(array, key_format: :lower_camel) expected = [{ name: 'Name 1', displayName: 'Display Name 1' }, diff --git a/test/unit/active_model/serializer/key_format_test.rb b/test/unit/active_model/serializer/key_format_test.rb index aada664a..135866bf 100644 --- a/test/unit/active_model/serializer/key_format_test.rb +++ b/test/unit/active_model/serializer/key_format_test.rb @@ -4,8 +4,8 @@ module ActiveModel class Serializer class KeyFormatTest < Minitest::Test def test_lower_camel_format_option - object = Blog.new({ name: 'Name 1', display_name: 'Display Name 1'}) - serializer = BlogSerializer.new(object, key_format: :lower_camel) + object = WebLog.new({ name: 'Name 1', display_name: 'Display Name 1'}) + serializer = WebLogSerializer.new(object, key_format: :lower_camel) expected = { name: 'Name 1', displayName: 'Display Name 1' } @@ -13,8 +13,8 @@ module ActiveModel end def test_lower_camel_format_serializer - object = Blog.new({ name: 'Name 1', display_name: 'Display Name 1'}) - serializer = BlogLowerCamelSerializer.new(object) + object = WebLog.new({ name: 'Name 1', display_name: 'Display Name 1'}) + serializer = WebLogLowerCamelSerializer.new(object) expected = { name: 'Name 1', displayName: 'Display Name 1' }