angus
(Angus McLeod)
1
升级到 Release v2.4.0.beta2 · discourse/discourse · GitHub 后,我们几乎所有的插件(例如主题列表预览、活动、地点、评分等)在使用 add_to_serializer 插件的 plugin.rb 方法时都遇到了问题。
现有的用法遵循以下格式:
add_to_serializer(:serializer, property) { value }
这在生产环境中不再有效,但在开发环境中仍然可以正常工作。
起初,我以为这可能与插件启用机制的处理方式有关。因为 add_to_serializer 的 _include? 方法使用了 enabled? 状态:
if define_include_method
# 如果插件被禁用,则不包含序列化方法
klass.public_send(:define_method, "include_#{attr}?") { plugin.enabled? }
end
然而,使用 enabled_site_setting 系统似乎并未解决该问题。此外,enabled? 方法似乎仍然默认为 true:
def enabled?
@enabled_site_setting ? SiteSetting.get(@enabled_site_setting) : true
end
为了解决当前的问题,我们已更改了插件序列化数据的方式,但如果可能的话,我想彻底查明原因。有人知道这里出了什么问题吗?
cc @merefield, @fzngagan
eviltrout
(Robin Ward)
2
这非常不寻常,因为我们在投票中使用此功能,而且它们显然没有损坏。我能想到的唯一原因是它们在测试版中曾出现问题,但在主分支中已修复?你能否在 tests-passed 分支上测试一下,看看它们是否正常工作?
angus
(Angus McLeod)
3
我今天会进一步测试。在投票中的用法略有不同,因为 _include? 方法总是被第三个 false 参数所排除。我怀疑 include? 方法可能是问题所在。
add_to_serializer(:post, :polls_votes, false)
angus
(Angus McLeod)
4
看起来这个问题特定于对类别序列化器的修改。
https://staging.discourse.angusmcleod.com.au 上只安装了一个插件,名为“test-add-to-serializer”。
正如您在 plugin.rb 中看到的,其中进行了多项序列化器修改。
对非类别序列化器的修改似乎正常工作,但对 basic_category 序列化器的修改仅在开发环境中生效。
您在以下地址找不到测试类别的属性:
https://staging.discourse.angusmcleod.com.au/categories.json
或
https://staging.discourse.angusmcleod.com.au/c/records-musicians.json
但您可以在以下地址找到其他测试属性:
https://staging.discourse.angusmcleod.com.au/t/this-is-a-title-of-a-topic/42.json
或
https://staging.discourse.angusmcleod.com.au/latest.json
因此,问题似乎不在于 add_to_serializer 方法本身,而在于对 basic_category 序列化器的修改。
angus
(Angus McLeod)
5
@j.jaffeux @dan 嘿 :), 看起来你们最近在 discourse-voting 上做了一些工作,以解决我在上面提到的同一个问题。
你们知道为什么现在仅仅向 basic_category_serializer 添加属性已经不够了吗?
sam
(Sam Saffron)
7
丹已退出,但本质上我们在三个不同的地方以不同数据量对类别进行序列化。我们将看看是否有办法消除这里的 mixin,因为这使得推理变得更加困难。
sam
(Sam Saffron)
8
已修复并反向移植到稳定版和测试版。
Dan 正确设置了继承结构,问题在于我们存在一个非常非常非常久远的核心漏洞。
sam
(Sam Saffron)
10
感谢您报告并推动解决此问题。这是一个非常棘手的问题,我花了一些时间阅读 Rails 内部机制才找到根源。
如果您好奇我们如何确保今后不再出现类似问题,请务必查看新增的测试用例。
fzngagan
(Faizaan Gagan)
11
非常感谢,@sam 这么快就修复了这个问题。
@angus,我们的插件在应用了此次修复所需的最近更改后,是否仍能正常工作?