diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index 1b55a812..1841f9ff 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -163,19 +163,21 @@ module ActiveModel def add_links(options) links = @hash.fetch(:links) { {} } - resources = serializer.instance_variable_get(:@resource) - @hash[:links] = add_pagination_links(links, resources, options) if is_paginated?(resources) + collection = serializer.object + if is_paginated?(collection) + @hash[:links] = add_pagination_links(links, collection, options) + end end - def add_pagination_links(links, resources, options) - pagination_links = JsonApi::PaginationLinks.new(resources, options[:context]).serializable_hash(options) + def add_pagination_links(links, collection, options) + pagination_links = JsonApi::PaginationLinks.new(collection, options[:context]).serializable_hash(options) links.update(pagination_links) end - def is_paginated?(resource) - resource.respond_to?(:current_page) && - resource.respond_to?(:total_pages) && - resource.respond_to?(:size) + def is_paginated?(collection) + collection.respond_to?(:current_page) && + collection.respond_to?(:total_pages) && + collection.respond_to?(:size) end end end diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index f2f916e5..252eadf2 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -3,23 +3,22 @@ module ActiveModel class ArraySerializer NoSerializerError = Class.new(StandardError) include Enumerable - delegate :each, to: :@objects + delegate :each, to: :@serializers - attr_reader :root, :meta, :meta_key + attr_reader :object, :root, :meta, :meta_key - def initialize(objects, options = {}) + def initialize(resources, options = {}) @root = options[:root] - @resource = objects - @objects = objects.map do |object| - serializer_class = options.fetch( - :serializer, - ActiveModel::Serializer.serializer_for(object) - ) + @object = resources + @serializers = resources.map do |resource| + serializer_class = options.fetch(:serializer) { + ActiveModel::Serializer.serializer_for(resource) + } if serializer_class.nil? - fail NoSerializerError, "No serializer found for object: #{object.inspect}" + fail NoSerializerError, "No serializer found for resource: #{resource.inspect}" else - serializer_class.new(object, options.except(:serializer)) + serializer_class.new(resource, options.except(:serializer)) end end @meta = options[:meta] @@ -27,7 +26,7 @@ module ActiveModel end def json_key - key = root || @objects.first.try(:json_key) || @resource.try(:name).try(:underscore) + key = root || @serializers.first.try(:json_key) || object.try(:name).try(:underscore) key.try(:pluralize) end end diff --git a/test/array_serializer_test.rb b/test/array_serializer_test.rb index 3eff3ef8..4600fd76 100644 --- a/test/array_serializer_test.rb +++ b/test/array_serializer_test.rb @@ -15,6 +15,10 @@ module ActiveModel resource end + def test_has_object_reader_serializer_interface + assert_equal @serializer.object, @resource + end + def test_respond_to_each assert_respond_to @serializer, :each end