Come personalizzare il routing in un plugin e renderizzare una pagina personalizzata?

Come posso personalizzare il routing in un plugin e renderizzare una pagina personalizzata?

Ho letto questo thread: Sviluppo di plugin per Discourse - Parte 5 - Aggiungere un’interfaccia amministrativa - Documentazione / Guida per sviluppatori - Discourse Meta e altri plugin, ma tutti hanno fallito.

I percorsi personalizzati restituiscono dati JSON, ma io voglio renderizzare un template Ember. C’è qualche thread che spiega questa conoscenza? Grazie mille.

Se è tutto ciò che vuoi fare, dai un’occhiata a:

E:

3 Mi Piace

Sono bloccato qui, ecco i miei passaggi specifici:

Ho definito il routing nel file plugins/q/config/routes.rb:

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

Controller: plugins/q/app/controllers/quectel/examples_controller.rb

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

Ora accedo a: localhost:4200/q/hello e restituisce il json

{"hello":"world"}

Come posso renderizzare il template Ember quando accedo a localhost:4200/q/hello?

Ho salvato questo argomento tra i preferiti tempo fa per leggerlo più tardi: Creating Routes in Discourse and Showing Data. Non sono sicuro che sia aggiornato, ma forse può ancora essere d’aiuto.

Sì, ho visto anche questo post e ho seguito i passaggi indicati, ma non funziona, appare l’errore “Pagina non trovata”. A quel punto, ero confuso.

ok, ho realizzato l’effetto desiderato studiando il codice di plugins/discourse-subscriptions.

Accedendo a /q/hello, viene visualizzato il contenuto del modello personalizzato e vengono recuperati i dati del backend personalizzato.

Di seguito sono riportati i passaggi:

  1. Crea un nuovo file di mappatura del percorso plugins/quectel/assets/javascripts/discourse/quectel-route-map.js
export default function quectel() {
  this.route("q/hello"); // Il percorso predefinito è /q/hello
};
  1. Crea un nuovo file di percorso 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') // Richiama l'interfaccia backend per ottenere i dati
  }
}
  1. Crea un nuovo file di modello frontend plugins/quectel/assets/javascripts/discourse/templates/q/hello.gjs, per renderizzare i dati
import QHello from '../../components/q-hello'

<template>
  <h1>q-hello</h1>
  {{!-- Renderizza il componente --}}
  <QHello />
  {{!-- Renderizza i dati del modello --}}
  <div>{{@model.hello}}</div>
</template>
  1. Crea un nuovo file del controller backend 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. Definisci il percorso backend 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" }

Accedendo a /q/hello, vedrai la seguente visualizzazione:

1 Mi Piace