From 572ff7db20c9a679ceec21e6af8091c304bd43fa Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Mon, 7 Sep 2015 15:38:00 +0200 Subject: [PATCH 1/2] Refactor `add_links` in JSONAPI adapter. --- .../serializer/adapter/json_api.rb | 22 +++++-------------- .../serializer/array_serializer.rb | 6 +++++ 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index c1e5c94f..ae736b5e 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -29,7 +29,10 @@ class ActiveModel::Serializer::Adapter::JsonApi < ActiveModel::Serializer::Adapt end end - add_links(options) + if serializer.paginated? + @hash[:links] ||= {} + @hash[:links].update(links_for(serializer, options)) + end else primary_data = primary_data_for(serializer, options) relationships = relationships_for(serializer) @@ -145,20 +148,7 @@ class ActiveModel::Serializer::Adapter::JsonApi < ActiveModel::Serializer::Adapt end end - def add_links(options) - links = @hash.fetch(:links) { {} } - collection = serializer.object - @hash[:links] = add_pagination_links(links, collection, options) if paginated?(collection) - end - - def add_pagination_links(links, resources, options) - pagination_links = ActiveModel::Serializer::Adapter::JsonApi::PaginationLinks.new(resources, options[:context]).serializable_hash(options) - links.update(pagination_links) - end - - def paginated?(collection) - collection.respond_to?(:current_page) && - collection.respond_to?(:total_pages) && - collection.respond_to?(:size) + def links_for(serializer, options) + JsonApi::PaginationLinks.new(serializer.object, options[:context]).serializable_hash(options) end end diff --git a/lib/active_model/serializer/array_serializer.rb b/lib/active_model/serializer/array_serializer.rb index 252eadf2..54cb17a0 100644 --- a/lib/active_model/serializer/array_serializer.rb +++ b/lib/active_model/serializer/array_serializer.rb @@ -29,6 +29,12 @@ module ActiveModel key = root || @serializers.first.try(:json_key) || object.try(:name).try(:underscore) key.try(:pluralize) end + + def paginated? + object.respond_to?(:current_page) && + object.respond_to?(:total_pages) && + object.respond_to?(:size) + end end end end From 285cdf841e8d82c65affd32100903bdde5ad08e2 Mon Sep 17 00:00:00 2001 From: Lucas Hosseini Date: Mon, 7 Sep 2015 17:40:10 +0200 Subject: [PATCH 2/2] Split `serializable_hash` into two methods. --- .../serializer/adapter/json_api.rb | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/lib/active_model/serializer/adapter/json_api.rb b/lib/active_model/serializer/adapter/json_api.rb index ae736b5e..38378e09 100644 --- a/lib/active_model/serializer/adapter/json_api.rb +++ b/lib/active_model/serializer/adapter/json_api.rb @@ -5,8 +5,6 @@ class ActiveModel::Serializer::Adapter::JsonApi < ActiveModel::Serializer::Adapt def initialize(serializer, options = {}) super - @hash = { data: [] } - @included = ActiveModel::Serializer::Utils.include_args_to_hash(@options[:include]) fields = options.delete(:fields) if fields @@ -19,38 +17,50 @@ class ActiveModel::Serializer::Adapter::JsonApi < ActiveModel::Serializer::Adapt def serializable_hash(options = nil) options ||= {} if serializer.respond_to?(:each) - serializer.each do |s| - result = self.class.new(s, @options.merge(fieldset: @fieldset)).serializable_hash(options) - @hash[:data] << result[:data] - - if result[:included] - @hash[:included] ||= [] - @hash[:included] |= result[:included] - end - end - - if serializer.paginated? - @hash[:links] ||= {} - @hash[:links].update(links_for(serializer, options)) - end + serializable_hash_for_collection(serializer, options) else - primary_data = primary_data_for(serializer, options) - relationships = relationships_for(serializer) - included = included_for(serializer) - @hash[:data] = primary_data - @hash[:data][:relationships] = relationships if relationships.any? - @hash[:included] = included if included.any? + serializable_hash_for_single_resource(serializer, options) end - @hash end def fragment_cache(cached_hash, non_cached_hash) root = false if @options.include?(:include) - ActiveModel::Serializer::Adapter::JsonApi::FragmentCache.new().fragment_cache(root, cached_hash, non_cached_hash) + ActiveModel::Serializer::Adapter::JsonApi::FragmentCache.new.fragment_cache(root, cached_hash, non_cached_hash) end private + def serializable_hash_for_collection(serializer, options) + hash = { data: [] } + serializer.each do |s| + result = self.class.new(s, @options.merge(fieldset: @fieldset)).serializable_hash(options) + hash[:data] << result[:data] + + if result[:included] + hash[:included] ||= [] + hash[:included] |= result[:included] + end + end + + if serializer.paginated? + hash[:links] ||= {} + hash[:links].update(links_for(serializer, options)) + end + + hash + end + + def serializable_hash_for_single_resource(serializer, options) + primary_data = primary_data_for(serializer, options) + relationships = relationships_for(serializer) + included = included_for(serializer) + hash = { data: primary_data } + hash[:data][:relationships] = relationships if relationships.any? + hash[:included] = included if included.any? + + hash + end + def resource_identifier_type_for(serializer) if ActiveModel::Serializer.config.jsonapi_resource_type == :singular serializer.object.class.model_name.singular