Вопрос о плагинах Discourse и config/initializers в Rails 6

Теперь всё становится на свои места. У меня не возникало проблем, потому что я даже при работе над ядром Discourse перезапускал сервер, а не просто перезагружал код.

Недавно, еще не будучи супер-экспертом в создании приложений на Rails, как многие из вас, я решил определить, какие переменные конфигурации должны обновляться без перезапуска Rails, и перенёс этот код в ApplicationController.

Я уверен, что есть более лучшие способы сделать это, но поскольку данная реализация на Rails представляет собой внутреннее приложение, где производительность не является критичной:

class ApplicationController < ActionController::Base

  before_action  :set_site_settings

  private

  def set_site_settings
    @use_custom_date_format = Sitesetting.where(name: "custom_date_format").pluck(:value).last
  end

end

Я буду рад, когда найду лучший способ решения этой задачи!

Однако, перенеся это из инициализаторов Rails, я позволил пользователю легко изменять эту настройку сайта, так как она теперь хранится в базе данных с помощью базовой CRUD-структуры Rails MVC.

Поскольку кэширование SQL в Rails не работает вне контекста действия, мне когда-нибудь нужно будет научиться переносить это в кэш и убедиться, что кэш очищается, когда контроллер Rails обрабатывает действие (например, при сохранении нового значения в контроллере настроек сайта и т. д.).

В любом случае, это клиентское приложение на Rails (только для внутреннего использования) не предназначено для высокопроизводительных задач, поэтому добавление запроса в ApplicationController работает нормально и избавляет меня от необходимости дублировать этот код в каждом контроллере проекта, где требуется эта настройка сайта.

Привет, @fzngagan, я определённо не «рубист» и имею гораздо меньше опыта работы с Rails, чем большинство разработчиков плагинов для Discourse; но, тем не менее: возможно, в будущем, если вам потребуется перезагружать файлы в вашем плагине без перезапуска приложения в продакшене (или в режиме разработки), вы сможете обойтись чем-то вроде этого:

after_initialize do

  # измените следующее на ваш контроллер по выбору
  # или используйте контроллер приложения, если это необходимо

  ApplicationController.class_eval do
    before_action :do_my_stuff

    def do_my_stuff
      load File.open(FAIZAANS_FAV_FILE)
    end
  end
end

Это позволит перезагружать файлы, как и ожидалось.

В настоящее время я использую это в плагине следующим образом, и это работает как надо:

after_initialize do

  Admin::AdminController.class_eval do
    before_action :do_neo_plugin_info

    def do_neo_plugin_info
      load File.open(PLUGIN_LOGIC)
    end
  end
end

Я использую этот код в плагине, над которым работаю время от времени, который отображает имена контейнеров, полученные из ENV["DATA_NAME"], а также свободное место на диске, полученное с помощью системного кода, использующего df и grep.

В наших административных представлениях:

Как уже упоминалось, я отнюдь не рубист; но этот метод работает для меня.

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

Например, если я перезагружаю страницу после удаления множества резервных копий Discourse, индикатор свободного места на диске изменяется, как и ожидалось.