diff --git a/README.md b/README.md index bb976b28..1d9db323 100644 --- a/README.md +++ b/README.md @@ -107,7 +107,12 @@ If you wish to use a serializer other than the default, you can explicitly pass #### 2. For an array resource: ```ruby - render json: @posts, serializer: PaginatedSerializer, each_serializer: PostPreviewSerializer +# Use the default `ArraySerializer`, which will use `each_serializer` to +# serialize each element +render json: @posts, each_serializer: PostPreviewSerializer + +# Or, you can explicitly provide the collection serializer as well +render json: @posts, serializer: PaginatedSerializer, each_serializer: PostPreviewSerializer ``` ## Installation diff --git a/lib/action_controller/serialization.rb b/lib/action_controller/serialization.rb index 150b9aa2..d157e2f9 100644 --- a/lib/action_controller/serialization.rb +++ b/lib/action_controller/serialization.rb @@ -9,12 +9,14 @@ module ActionController ADAPTER_OPTION_KEYS = [:include, :root] def get_serializer(resource, options) - @_serializer ||= if (serializer = options.delete :serializer) - options[:serializer] = options.delete :each_serializer - serializer - else - ActiveModel::Serializer.serializer_for(resource) + @_serializer ||= options.delete(:serializer) + @_serializer ||= ActiveModel::Serializer.serializer_for(resource) + + if options.key?(:each_serializer) + options[:serializer] = options.delete(:each_serializer) end + + @_serializer end [:_render_option_json, :_render_with_renderer_json].each do |renderer_method| diff --git a/test/action_controller/explicit_serializer_test.rb b/test/action_controller/explicit_serializer_test.rb index e4bddd04..cb8b2bd7 100644 --- a/test/action_controller/explicit_serializer_test.rb +++ b/test/action_controller/explicit_serializer_test.rb @@ -24,6 +24,19 @@ module ActionController serializer: PaginatedSerializer, each_serializer: ProfilePreviewSerializer end + + def render_array_using_implicit_serializer + array = [ + Profile.new(name: 'Name 1', + description: 'Description 1', + comments: 'Comments 1'), + Profile.new(name: 'Name 2', + description: 'Description 2', + comments: 'Comments 2') + ] + render json: array, + each_serializer: ProfilePreviewSerializer + end end tests MyController @@ -48,6 +61,18 @@ module ActionController assert_equal expected.to_json, @response.body end + + def test_render_array_using_explicit_serializer + get :render_array_using_implicit_serializer + assert_equal 'application/json', @response.content_type + + expected = [ + { 'name' => 'Name 1' }, + { 'name' => 'Name 2' } + ] + assert_equal expected.to_json, @response.body + end + end end end