mirror of
https://github.com/discourse/discourse.git
synced 2025-05-24 03:36:18 +08:00
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:
@ -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
|
||||
|
||||
|
Reference in New Issue
Block a user