我最近一直在提供有关如何使用 Discourse 中的 .erb 模板的建议,并注意到这里元上关于此主题的细节不多,因此我想在此开始创建关于此主题的维基。本维基假定您知道什么是 .erb 模板及其在 Discourse 和更广泛的 Rails 中的功能。如果您想了解更多关于该背景的详细信息,请先阅读此内容。
服务器插件插口 (Server plugin outlets)
服务器插件插口的工作方式与客户端插件插口类似,尽管只有少数几个。它们允许您将自己的 .erb 模板插入到 discourse/discourse .erb 模板中。它们的定义如下:
<%= server_plugin_outlet [name] %>
有关示例,请参阅 chat 插件中 unsubscribe_options 插口的用法:
HTML 构建器 (HTML builders)
HTML 构建器专为动态构建的标准 HTML 而设计,而不是使用模板和插件插口。要在 .erb 模板中使用 HTML 构建器,请查找这些插入点:
<%= build_plugin_html [name] %>
您可以通过在 plugin.rb 文件中返回到 register_html_builder 块来在这些点插入 HTML,例如:
register_html_builder([name]) do |controller|
## 构建并返回您的自定义 HTML
end
有关示例,请参阅 solved 插件中 server:before-head-close-crawler 的用法:
您实际上可以注册 HTML 构建器来添加客户端 HTML,但这并不推荐。请使用客户端插件插口和模板添加客户端 HTML。
类似地,还有一个名为 register_custom_html 的服务器端插件 API 方法,可用于类似目的,但除非您有特定原因需要这样做,并且您知道自己在做什么,否则我不建议使用它。
覆盖模板 (Overriding a template)
您可以通过将插件的视图添加到控制器的 view_paths 来覆盖插件中的 .erb 模板。这只是 Rails 的功能,并非 Discourse 特有。Rails 指南在此处介绍了其工作原理:
例如,如果您想覆盖 app/views/email/unsubscribed.html.erb,您应该做两件事:
使用相同的命名空间构建插件视图结构
您的模板应在此处:
your-plugin-folder/app/views/email/unsubscribed.html.erb
将插件视图路径添加到相关控制器
在这种情况下,相关控制器是 EmailController。在您的 plugin.rb 文件中添加以下内容:
EmailController.prepend_view_path File.expand_path("../views", __FILE__)
您可以在大多数情况下将插件的视图添加到全局视图路径,但通常没有必要。