FIX: add_to_serializer not correctly accounting for inheritance chains

This is a very long standing bug we had, if a plugin attempted to amend a
serializer core was not "correcting" the situation for all descendant classes
this often only showed up in production cause production eager loads serializers
prior to plugins amending them.

This is a critical fix for various plugins
This commit is contained in:
Sam Saffron
2019-08-27 18:21:53 +10:00
parent a3cd73ef27
commit bd5fa1737d
2 changed files with 44 additions and 9 deletions

View File

@ -94,18 +94,21 @@ class Plugin::Instance
def add_to_serializer(serializer, attr, define_include_method = true, &block)
reloadable_patch do |plugin|
klass = "#{serializer.to_s.classify}Serializer".constantize rescue "#{serializer.to_s}Serializer".constantize
base = "#{serializer.to_s.classify}Serializer".constantize rescue "#{serializer.to_s}Serializer".constantize
unless attr.to_s.start_with?("include_")
klass.attributes(attr)
# we have to work through descendants cause serializers may already be baked and cached
([base] + base.descendants).each do |klass|
unless attr.to_s.start_with?("include_")
klass.attributes(attr)
if define_include_method
# Don't include serialized methods if the plugin is disabled
klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
if define_include_method
# Don't include serialized methods if the plugin is disabled
klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end
end
end
klass.public_send(:define_method, attr, &block)
klass.public_send(:define_method, attr, &block)
end
end
end