Работа с .erb-шаблонами в плагине

Недавно я давал советы по работе с .erb-шаблонами в Discourse и заметил, что на meta нет подробной информации по этой теме, поэтому решил создать эту вики-страницу. Предполагается, что вы уже знаете, что такое .erb-шаблоны и какова их роль в Discourse и в Rails в целом. Если вам нужны дополнительные сведения об этом, сначала прочитайте следующее:

Серверные плагиновые точки расширения (server plugin outlets)

Серверные плагиновые точки расширения работают аналогично клиентским плагиновым точкам расширения, хотя их всего несколько. Они позволяют вставить ваш собственный .erb-шаблон в .erb-шаблон из репозитория discourse/discourse. Они определяются следующим образом:

<%= server_plugin_outlet [name] %>

Пример использования точки расширения unsubscribe_options в плагине chat:

HTML-строители (HTML builders)

HTML-строители предназначены для стандартного HTML, который создаётся динамически, вместо использования шаблонов и плагиновых точек расширения. Чтобы использовать HTML-строители в .erb-шаблонах, найдите следующие точки вставки:

<%= build_plugin_html [name] %>

Вы можете вставить HTML в эти точки, вернув его в блоке register_html_builder в вашем файле plugin.rb, то есть:

register_html_builder([name]) do |controller|
   ## создайте и верните ваш пользовательский HTML
end

Пример использования server:before-head-close-crawler в плагине solved:

Фактически, можно регистрировать HTML-строители и для добавления клиентского HTML, однако это не рекомендуется. Добавляйте клиентский HTML с помощью клиентских плагиновых точек расширения и шаблонов.

Аналогично существует серверный метод плагинного API под названием register_custom_html, который можно использовать для схожих целей. Однако, если у вас нет для этого конкретных причин и вы точно знаете, что делаете, я бы не рекомендовал его использовать.

Переопределение шаблона

Вы можете переопределить .erb-шаблоны из плагина, добавив представления вашего плагина в view_paths контроллера. Это стандартная функциональность 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__)

Вы можете добавить представления вашего плагина в глобальные пути к представлениям, но в большинстве случаев в этом нет необходимости.

8 лайков