Какой официально поддерживаемый способ кастомизации вывода RSS для темы путём замены шаблона show.rss.erb по умолчанию?

Цель

  • Заменить оригинальный шаблон Discourse в discourse/app/views/topics/show.rss.erb.
  • Разместить пользовательский шаблон в директории плагина: discourse-XXX/app/views/topics/show.rss.erb.
  • Цель: заставить RSS-страницы загружать шаблон плагина вместо оригинального шаблона.

Попытки и результаты

Подход 1: Прямое размещение пользовательского шаблона в директории плагина

  • Действие: Поместить пользовательский show.rss.erb в discourse-XXX/app/views/topics/.
  • Результат: Используется оригинальный шаблон; RSS-страница не загружает шаблон плагина.

Подход 2: after_initialize с prepend_view_path

after_initialize do
  class ::TopicsController
    prepend_view_path File.expand_path("../app/views", __dir__)
  end
end
  • Результат: Шаблон плагина игнорируется; RSS-страница продолжает использовать оригинальный шаблон.

Подход 3: after_initialize с prepend_view_path, указывающим на директорию плагина

after_initialize do
  class ::TopicsController
    prepend_view_path Rails.root.join("plugins/discourse-XXX-plugin-name/app/views")
  end
end
  • Результат: Шаблон плагина всё ещё не используется; RSS-страница продолжает рендерить оригинальный шаблон.

Подход 4: Переопределение метода feed и явный рендеринг шаблона плагина

class ::TopicsController
  prepend_view_path Rails.root.join("plugins/discourse-XXX/app/views")

  alias_method :original_feed, :feed
  def feed
    raise Discourse::NotFound if !Post.exists?(topic_id: params[:topic_id])

    begin
      @topic_view = TopicView.new(params[:topic_id])
    rescue Discourse::NotLoggedIn
      raise Discourse::NotFound
    rescue Discourse::InvalidAccess => ex
      deleted =
        guardian.can_see_topic?(ex.obj, false) ||
        (!guardian.can_see_topic?(ex.obj) && ex.obj&.access_topic_via_group && ex.obj.deleted_at)

      raise Discourse::NotFound.new(
        nil,
        check_permalinks: deleted,
        original_path: ex.obj.relative_url,
      )
    end

    @first_post = @topic_view.posts.first

    discourse_expires_in 1.minute
    response.headers["X-Robots-Tag"] = "noindex, nofollow"

    render file: Rails.root.join("plugins/discourse-XXX/app/views/topics/show.rss.erb"), formats: [:rss]
  end
end
  • Результат: Похоже, что шаблон плагина вызывается, но при посещении .rss-страницы темы возникает ошибка oops.

Надеюсь, этот отчёт чётко суммирует предпринятые попытки и возникшие проблемы. Буду очень признателен за любые идеи, предложения или решения от сообщества для успешной замены шаблона show.rss.erb. Заранее спасибо за помощь!

  • Я думаю, вам стоит использовать __FILE__ вместо __dir__
  • Если вы вызываете это вне тела класса, должно быть self.prepend_view_path

Так что, полагаю, это сработает

after_initialize do
  class ::TopicsController
    self.prepend_view_path File.expand_path("../app/views", __FILE__)
  end
end