更改文件的插件简单示例?

我正在尝试编写我的第一个非常基础的 Discourse 插件,在阅读了大量关于 Ruby 的知识以及该语言为我们提供的优势之后 :slight_smile:

我想在特定页面(如徽章、排行榜(游戏化))上添加文本,并进行一些简单的编辑,例如更改搜索结果的默认行为,将“最后发帖”而不是“相关性”作为排序依据。

我明白最好的方法是避免分支核心并编写插件。那么,如果我想从插件中更改 Discourse 的特定文件,可以在哪里查找?

我们可以以编辑此文件为例:

如何告诉 Discourse 使用插件 topic_embed.rb 并替换默认文件?

2 个赞

这是一种称为“猴子补丁”的技术。有几种方法可以实现这一点,但最简单的方法是直接在插件中定义要替换的方法。

after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # 你的代码
    end
  end
end
2 个赞

好吧,我们应该来自猴子,所以毕竟,遵循你的例子,这可能是一件好事 :slight_smile:

感谢您的回复!我正在尝试,但如果我想更改整个 embed.rb 文件,该怎么办?

我看到这只能用来替换一个特定的类,但我想完全替换 embed,删除按钮并显示一个简单的 onebox。

我可以处理这个文件,但我不知道如何在不分叉(这似乎是 gorilla patching)的情况下将这个文件放入 Discourse。

1 个赞

这里有太多现有的材料。看看现有的几十个插件就知道了。

这是一个覆盖 onebox 系统的示例:

请注意,补丁可以非常精确和巧妙(这个插件并不特别!但这部分是由于核心代码的结构,使得覆盖必然冗长),其技巧在于尽可能少地进行操作以达到预期的效果:如果您打算覆盖整个文件,您可能需要重新考虑您的总体方法。

同样,正如 Richard 所说,您几乎从不(至少在 Ruby on Rails 中)覆盖整个文件。您需要考虑方法。

3 个赞