我正在尝试编写我的第一个非常基础的 Discourse 插件,在阅读了大量关于 Ruby 的知识以及该语言为我们提供的优势之后 
我想在特定页面(如徽章、排行榜(游戏化))上添加文本,并进行一些简单的编辑,例如更改搜索结果的默认行为,将“最后发帖”而不是“相关性”作为排序依据。
我明白最好的方法是避免分支核心并编写插件。那么,如果我想从插件中更改 Discourse 的特定文件,可以在哪里查找?
我们可以以编辑此文件为例:
如何告诉 Discourse 使用插件 topic_embed.rb 并替换默认文件?
2 个赞
RGJ
(Richard - Communiteq)
2
这是一种称为“猴子补丁”的技术。有几种方法可以实现这一点,但最简单的方法是直接在插件中定义要替换的方法。
after_initialize do
class ::TopicEmbed
def self.imported_from_html(url)
# 你的代码
end
end
end
2 个赞
好吧,我们应该来自猴子,所以毕竟,遵循你的例子,这可能是一件好事 
感谢您的回复!我正在尝试,但如果我想更改整个 embed.rb 文件,该怎么办?
我看到这只能用来替换一个特定的类,但我想完全替换 embed,删除按钮并显示一个简单的 onebox。
我可以处理这个文件,但我不知道如何在不分叉(这似乎是 gorilla patching)的情况下将这个文件放入 Discourse。
1 个赞
这里有太多现有的材料。看看现有的几十个插件就知道了。
这是一个覆盖 onebox 系统的示例:
请注意,补丁可以非常精确和巧妙(这个插件并不特别!但这部分是由于核心代码的结构,使得覆盖必然冗长),其技巧在于尽可能少地进行操作以达到预期的效果:如果您打算覆盖整个文件,您可能需要重新考虑您的总体方法。
同样,正如 Richard 所说,您几乎从不(至少在 Ruby on Rails 中)覆盖整个文件。您需要考虑方法。
3 个赞