Как в плагине настроить кастомные маршруты и отрендерить кастомную страницу?

Как в плагине настроить пользовательские маршруты и отрисовать пользовательскую страницу?

Я изучил этот пост: Разработка плагинов для Discourse — Часть 5 — Добавление административного интерфейса — Документация / Руководство разработчика — Discourse Meta, а также другие плагины, но всё безрезультатно.

Пользовательские маршруты возвращают данные в формате JSON, а мне нужно отрисовать шаблон Ember. Есть ли здесь посты, объясняющие эту тему? Большое спасибо.

Если вы хотите сделать только это, посмотрите:

И:

Я застрял на этом этапе. Вот мои конкретные шаги:

В файле plugins/q/config/routes.rb я определил маршрут:

get "/hello" => "examples#hello"

Контроллер: plugins/q/app/controllers/quectel/examples_controller.rb

def hello
   render json: { hello: "world" }
end

При обращении к адресу localhost:4200/q/hello возвращается JSON:

{"hello":"world"}

Как мне сделать так, чтобы при обращении к localhost:4200/q/hello рендерился шаблон Ember?

Я добавил эту тему в закладки некоторое время назад, чтобы прочитать позже: Creating Routes in Discourse and Showing Data. Не уверен, что она актуальна, но, возможно, она всё ещё поможет.

Да, я тоже прочитал этот пост и выполнил описанные в нём шаги, но ничего не получилось — появляется ошибка «Страница не найдена». После этого я просто растерялся.

Отлично, я, изучив код plugins/discourse-subscriptions, примерно реализовал желаемый эффект.

При访问 /q/hello отображается содержимое пользовательского шаблона и запрашиваются пользовательские данные с бэкенда.

Ниже приведены мои шаги:

  1. Создайте файл сопоставления путей plugins/quectel/assets/javascripts/discourse/quectel-route-map.js:
export default function quectel() {
  this.route("q/hello"); // Маршрут по умолчанию — /q/hello
};
  1. Создайте файл маршрута plugins/quectel/assets/javascripts/discourse/routes/q/hello.js:
import Route from "@ember/routing/route";
import { ajax } from "discourse/lib/ajax";

export default class HelloRoute extends Route {
  model() {
    return ajax('/q/hello'); // Запрос к бэкенду для получения данных
  }
}
  1. Создайте файл шаблона фронтенда plugins/quectel/assets/javascripts/discourse/templates/q/hello.gjs для отображения данных:
import QHello from '../../components/q-hello'

<template>
  <h1>q-hello</h1>
  {{!-- Отображение компонента --}}
  <QHello />
  {{!-- Отображение данных модели --}}
  <div>{{@model.hello}}</div>
</template>
  1. Создайте файл контроллера бэкенда plugins/quectel/app/controllers/quectel/examples_controller.rb:
# frozen_string_literal: true

module ::Quectel
  class ExamplesController < ::ApplicationController
    requires_plugin PLUGIN_NAME

    def hello
      render json: { hello: "hello 2333" }
    end
  end
end
  1. Определите маршруты бэкенда в файле plugins/quectel/config/routes.rb:
# frozen_string_literal: true

Quectel::Engine.routes.draw do
  get "/hello" => "examples#hello"
end

Discourse::Application.routes.draw { mount ::Quectel::Engine, at: "q" }

При访问 /q/hello вы увидите следующее: