diff --git a/lib/active_model/serializer/adapter/fragment_cache.rb b/lib/active_model/serializer/adapter/fragment_cache.rb index 231ddaed..ae15995f 100644 --- a/lib/active_model/serializer/adapter/fragment_cache.rb +++ b/lib/active_model/serializer/adapter/fragment_cache.rb @@ -54,8 +54,8 @@ module ActiveModel end def fragment_serializer(name, klass) - cached = "#{name.capitalize}CachedSerializer" - non_cached = "#{name.capitalize}NonCachedSerializer" + cached = "#{to_valid_const_name(name)}CachedSerializer" + non_cached = "#{to_valid_const_name(name)}NonCachedSerializer" Object.const_set cached, Class.new(ActiveModel::Serializer) unless Object.const_defined?(cached) Object.const_set non_cached, Class.new(ActiveModel::Serializer) unless Object.const_defined?(non_cached) @@ -72,6 +72,10 @@ module ActiveModel cached_attributes(klass, serializers) serializers end + + def to_valid_const_name(name) + name.gsub('::', '_') + end end end end diff --git a/test/adapter/fragment_cache_test.rb b/test/adapter/fragment_cache_test.rb index d249637a..e2e4e2f4 100644 --- a/test/adapter/fragment_cache_test.rb +++ b/test/adapter/fragment_cache_test.rb @@ -4,11 +4,14 @@ module ActiveModel class Adapter class FragmentCacheTest < Minitest::Test def setup + @spam = Spam::UnrelatedLink.new(id: "spam-id-1") @author = Author.new(name: 'Joao M. D. Moura') @role = Role.new(name: 'Great Author', description:nil) @role.author = [@author] @role_serializer = RoleSerializer.new(@role) + @spam_serializer = Spam::UnrelatedLinkSerializer.new(@spam) @role_hash = FragmentCache.new(RoleSerializer.adapter.new(@role_serializer), @role_serializer, {}) + @spam_hash = FragmentCache.new(Spam::UnrelatedLinkSerializer.adapter.new(@spam_serializer), @spam_serializer, {}) end def test_fragment_fetch_with_virtual_attributes @@ -20,6 +23,13 @@ module ActiveModel } assert_equal(@role_hash.fetch, expected_result) end + + def test_fragment_fetch_with_namespaced_object + expected_result = { + id: @spam.id + } + assert_equal(@spam_hash.fetch, expected_result) + end end end end diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 1a52dcec..26397191 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -250,6 +250,7 @@ VirtualValueSerializer = Class.new(ActiveModel::Serializer) do end Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do + cache only: [:id] attributes :id end