Wie kann ich in einem Plugin eine benutzerdefinierte Route definieren und dann eine benutzerdefinierte Seite rendern?
Ich habe diesen Beitrag gelesen: Discourse-Plugins entwickeln – Teil 5 – Eine Admin-Oberfläche hinzufügen – Dokumentation / Entwickler-Leitfaden – Discourse Meta und andere Plugins, aber es hat alles nicht funktioniert.
Meine benutzerdefinierten Routen geben alle JSON-Daten zurück, aber ich möchte Ember-Vorlagen rendern. Gibt es einen Beitrag, der dieses Wissen erklärt? Vielen Dank im Voraus.
merefield
(Robert)
16. Dezember 2025 um 08:58
2
Wenn das alles ist, was Sie tun möchten, werfen Sie einen Blick auf:
Und:
Just to point out you can now display arbitrary pages within Discourse using the Landing Pages Plugin in combination with a couple of extensions:
3 „Gefällt mir“
Ich stecke gerade hier fest, hier sind meine spezifischen Schritte:
Ich habe die Route in der Datei plugins/q/config/routes.rb definiert:
get "/hello" => "examples#hello"
Controller: plugins/q/app/controllers/quectel/examples_controller.rb
def hello
render json: { hello: "world" }
end
Wenn ich jetzt auf localhost:4200/q/hello zugreife, wird das JSON zurückgegeben:
{"hello":"world"}
Wie kann ich beim Zugriff auf localhost:4200/q/hello das Ember-Template rendern?
Moin
16. Dezember 2025 um 10:02
5
Ich habe dieses Thema vor einiger Zeit als Lesezeichen gespeichert, um es später zu lesen: Creating Routes in Discourse and Showing Data . Ich bin mir nicht sicher, ob es noch aktuell ist, aber vielleicht hilft es trotzdem weiter.
Ja, ich habe diesen Beitrag auch gesehen und die Schritte befolgt, aber es funktioniert nicht. Es erscheint der Fehler „Seite nicht gefunden“. Dann war ich ratlos.
ok, durch die Untersuchung des Codes von plugins/discourse-subscriptions habe ich ungefähr das gewünschte Ergebnis erzielt.
Der Zugriff auf /q/hello zeigt den benutzerdefinierten Vorlageninhalt an und ruft benutzerdefinierte Backend-Daten ab.
Hier sind meine Schritte:
Neue Pfadzuordnungsdatei erstellen: plugins/quectel/assets/javascripts/discourse/quectel-route-map.js
export default function quectel() {
this.route("q/hello"); // Die Route ist standardmäßig /q/hello
};
Neue Routendatei erstellen: 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') // Backend-Schnittstelle aufrufen, um Daten abzurufen
}
}
Neue Frontend-Vorlagendatei erstellen: plugins/quectel/assets/javascripts/discourse/templates/q/hello.gjs, um die Daten zu rendern
import QHello from '../../components/q-hello'
<template>
<h1>q-hello</h1>
{{!-- Komponente rendern --}}
<QHello />
{{!-- Modelldaten rendern --}}
<div>{{@model.hello}}</div>
</template>
Neue Backend-Controller-Datei erstellen: 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
Backend-Route definieren: 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" }
Beim Zugriff auf /q/hello wird die folgende Anzeige angezeigt:
1 „Gefällt mir“