Can I override app/views/layouts/application.html.erb from a plugin?

I have a very specific scenario where I need to load and cache the site header and footer from our primary website. This is fairly trivial to do in ERB:

<!-- My Customization -->
  <% cache("footer_#{I18n.locale}", expires_in: 1.week) do %>
    <%= raw open("https://myserver.com/#{I18n.locale}/remote/footer").read %>
  <% end %>
<!-- End Customization -->

Note in my example that I am passing along the I18n locale as well.

Neither the caching nor passing the locale will work with the html custom header option provided with Discourse so I’m left with two options, both of which would need to be implemented as a plugin.


OPTION 1: Use Javascript

There are outlets placed where my header and footer would go, but I don’t know how to cache the requests and I can see this quickly becoming taxing on both the server and the Ember app if server-side caching is not used.

OPTION 2: Override the application.html.erb template

First off: I am very aware that I would have to keep my custom plugin in lock-step with any changes to Discourse to ensure that my override doesn’t interfere with upgrades.

This would be my preference but I can’t seem to find any convention that will let me override the ERB templates from a plugin.

Has anyone tried this? Am I on a fools errand?

Thanks in advance for your help.

Yes, you can override the set_layout method in application_controller.rb. Take a look at this (unfinished) plugin for an example:

This does EXACTLY what I needed. THANKS @simon!

Извините, что воскрешаю эту очень старую тему, надеюсь, это допустимо.

Можно ли переопределить (в плагине)?

app/views/layouts/application.html.erb

Так:

register_asset '../views/layouts/application.html.erb'

Подозреваю, что ответ — «НЕТ!»… если «нет» (поскольку в Rails «активы» не являются «представлениями»), можем ли мы иметь в будущем метод плагина:

register_view

Чтобы в будущем мы могли просто сделать это (например):

register_asset 'layouts/application.html.erb'

и переопределить 'layouts/application.html.erb'

Мне это кажется хорошей идеей, хотя я отнюдь не эксперт по плагинам Discourse.

Спасибо за ваше внимание.

Просто сделайте это в виде темы. Вы можете добавить стандартный кэширующий слой перед любым API, из которого получаются данные.

Можно ли использовать встроенный код Ruby в теме?

Должно быть, я запутался… думал, что работа с темами не предполагает использование встроенного Ruby.

Редактирование:

Только что изучил следующую тему и, как и предполагал, не нашёл никаких ссылок на добавление встроенного Ruby в тему :slight_smile:

Developing Discourse Themes & Theme Components

Перечитываю…

Я забыл про блок cache и предполагал, что запрос будет отправляться на сервер при каждом обращении, поэтому думал, что также сработает fetch на стороне клиента.

Вместо этого можно реализовать так: удалённый сервер будет отправлять контент в раздел HTML Footer компонента темы.