From d67f7da11402d9fd9dde4721b5859c02f346efbe Mon Sep 17 00:00:00 2001 From: Brian McManus Date: Fri, 22 Jan 2016 11:24:30 -0800 Subject: [PATCH] Preserve the serializer type when fragment caching We were not previously cloning the type setting into the dynamically generated cached/non-cached serializers for a given fragment-cached serializer. This led to the type generated for JsonApi having the wrong value when fragment caching is enabled by adding either :except or :only options to cache. This pulls the type setting from the fragment-cached serializer forward onto the dynamic caching classes so it is preserved in the output. --- .../serializer/adapter/fragment_cache.rb | 4 ++++ test/adapter/fragment_cache_test.rb | 14 +++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/lib/active_model/serializer/adapter/fragment_cache.rb b/lib/active_model/serializer/adapter/fragment_cache.rb index 5c97a64a..02d56eaa 100644 --- a/lib/active_model/serializer/adapter/fragment_cache.rb +++ b/lib/active_model/serializer/adapter/fragment_cache.rb @@ -94,6 +94,10 @@ module ActiveModel cached.constantize.cache(klass._cache_options) + # Preserve the type setting in the cached/non-cached serializer classes + cached.constantize.type(klass._type) + non_cached.constantize.type(klass._type) + cached.constantize.fragmented(serializer) non_cached.constantize.fragmented(serializer) diff --git a/test/adapter/fragment_cache_test.rb b/test/adapter/fragment_cache_test.rb index 0ad78eb5..aded06d4 100644 --- a/test/adapter/fragment_cache_test.rb +++ b/test/adapter/fragment_cache_test.rb @@ -3,6 +3,14 @@ module ActiveModel class Serializer module Adapter class FragmentCacheTest < ActiveSupport::TestCase + TypedRoleSerializer = Class.new(ActiveModel::Serializer) do + type 'my-roles' + cache only: [:name], skip_digest: true + attributes :id, :name, :description + + belongs_to :author + end + def setup super @spam = Spam::UnrelatedLink.new(id: 'spam-id-1') @@ -31,8 +39,12 @@ module ActiveModel } assert_equal(@spam_hash.fetch, expected_result) end + + def test_fragment_fetch_with_type_override + serialization = serializable(Role.new(name: 'Another Author'), serializer: TypedRoleSerializer, adapter: :json_api).serializable_hash + assert_equal(TypedRoleSerializer._type, serialization.fetch(:data).fetch(:type)) + end end end end end -