Como personalizar rotas e renderizar páginas personalizadas em um plugin?

No plugin, como eu personalizo uma rota e renderizo uma página personalizada?

Eu li este tópico: Desenvolvendo Plugins do Discourse - Parte 5 - Adicionar uma Interface de Administrador - Discussão / Guia do Desenvolvedor - Discourse Meta, e outros plugins, mas todos falharam.

Minhas rotas personalizadas estão retornando dados JSON, mas eu quero renderizar um template Ember. Existe algum tópico que explique esse conhecimento? Muito obrigado.

Se é só isso que você quer fazer, dê uma olhada em:

E:

3 curtidas

Estou preso aqui, a seguir estão meus passos específicos:

Eu defini a rota no arquivo plugins/q/config/routes.rb:

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

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

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

Agora, ao acessar: localhost:4200/q/hello, ele retorna o json:

{"hello":"world"}

Como posso fazer com que o acesso a localhost:4200/q/hello renderize o template do Ember?

Eu marquei este tópico há algum tempo para ler mais tarde: Creating Routes in Discourse and Showing Data. Não tenho certeza se está atualizado, mas talvez ainda ajude.

Sim, eu também vi este post e segui os passos acima, mas não funcionou, aparecendo o erro “Página não encontrada”. Então, fiquei confuso.

ok, estudei o código de plugins/discourse-subscriptions e implementei aproximadamente o efeito desejado.

Acessar /q/hello exibe o conteúdo do template personalizado e obtém dados de backend personalizados.

Abaixo estão minhas etapas:

  1. Crie um novo arquivo de mapeamento de caminho plugins/quectel/assets/javascripts/discourse/quectel-route-map.js
export default function quectel() {
  this.route("q/hello"); // A rota é /q/hello por padrão
};
  1. Crie um arquivo de rota 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') // Solicita a interface de backend para obter dados
  }
}
  1. Crie um arquivo de template frontend plugins/quectel/assets/javascripts/discourse/templates/q/hello.gjs, renderize os dados
import QHello from '../../components/q-hello'

<template>
  <h1>q-hello</h1>
  {{!-- Renderiza o componente --}}
  <QHello />
  {{!-- Renderiza os dados do modelo --}}
  <div>{{@model.hello}}</div>
</template>
  1. Crie um arquivo de controlador de 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. Defina a rota de 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" }

Ao acessar /q/hello, você verá a seguinte exibição:

1 curtida