diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index b4cbc73d..d49e9c29 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -44,6 +44,11 @@ module ActionController (json.respond_to?(:active_model_serializer) && json.active_model_serializer) if json.respond_to?(:to_ary) + unless serializer <= ActiveModel::ArraySerializer + raise ArgumentError.new("#{serializer.name} is not an ArraySerializer. " + + "You may want to use the :each_serializer option instead.") + end + 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 diff --git a/test/serialization_test.rb b/test/serialization_test.rb index d778de7b..abe4a77c 100644 --- a/test/serialization_test.rb +++ b/test/serialization_test.rb @@ -152,6 +152,10 @@ class RenderJsonTest < ActionController::TestCase render :json => [Object.new], :each_serializer => CustomSerializer end + def render_json_array_with_wrong_option + render :json => [Object.new], :serializer => CustomSerializer + end + def render_json_with_links render :json => HypermediaSerializable.new end @@ -286,6 +290,12 @@ class RenderJsonTest < ActionController::TestCase assert_match '{"test":[{"hello":true}]}', @response.body end + def test_render_json_array_with_wrong_option + assert_raise ArgumentError do + get :render_json_array_with_wrong_option + end + end + def test_render_json_with_links get :render_json_with_links assert_match '{"link":"http://www.nextangle.com/hypermedia"}', @response.body