Update fragment cache to support namespaced objects

This commit is contained in:
Aaron Lerch 2015-08-17 17:12:30 -04:00
parent 6aba260491
commit 35c8f0d835
3 changed files with 17 additions and 2 deletions

View File

@ -54,8 +54,8 @@ module ActiveModel
end end
def fragment_serializer(name, klass) def fragment_serializer(name, klass)
cached = "#{name.capitalize}CachedSerializer" cached = "#{to_valid_const_name(name)}CachedSerializer"
non_cached = "#{name.capitalize}NonCachedSerializer" non_cached = "#{to_valid_const_name(name)}NonCachedSerializer"
Object.const_set cached, Class.new(ActiveModel::Serializer) unless Object.const_defined?(cached) 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) 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) cached_attributes(klass, serializers)
serializers serializers
end end
def to_valid_const_name(name)
name.gsub('::', '_')
end
end end
end end
end end

View File

@ -4,11 +4,14 @@ module ActiveModel
class Adapter class Adapter
class FragmentCacheTest < Minitest::Test class FragmentCacheTest < Minitest::Test
def setup def setup
@spam = Spam::UnrelatedLink.new(id: "spam-id-1")
@author = Author.new(name: 'Joao M. D. Moura') @author = Author.new(name: 'Joao M. D. Moura')
@role = Role.new(name: 'Great Author', description:nil) @role = Role.new(name: 'Great Author', description:nil)
@role.author = [@author] @role.author = [@author]
@role_serializer = RoleSerializer.new(@role) @role_serializer = RoleSerializer.new(@role)
@spam_serializer = Spam::UnrelatedLinkSerializer.new(@spam)
@role_hash = FragmentCache.new(RoleSerializer.adapter.new(@role_serializer), @role_serializer, {}) @role_hash = FragmentCache.new(RoleSerializer.adapter.new(@role_serializer), @role_serializer, {})
@spam_hash = FragmentCache.new(Spam::UnrelatedLinkSerializer.adapter.new(@spam_serializer), @spam_serializer, {})
end end
def test_fragment_fetch_with_virtual_attributes def test_fragment_fetch_with_virtual_attributes
@ -20,6 +23,13 @@ module ActiveModel
} }
assert_equal(@role_hash.fetch, expected_result) assert_equal(@role_hash.fetch, expected_result)
end end
def test_fragment_fetch_with_namespaced_object
expected_result = {
id: @spam.id
}
assert_equal(@spam_hash.fetch, expected_result)
end
end end
end end
end end

View File

@ -250,6 +250,7 @@ VirtualValueSerializer = Class.new(ActiveModel::Serializer) do
end end
Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
cache only: [:id]
attributes :id attributes :id
end end