プラグインでカスタムルートを定義し、カスタムページをレンダリングするにはどうすればよいですか?

プラグイン内でカスタムルートを定義し、カスタムページをレンダリングするにはどうすればよいですか?

この記事:Discourse プラグインの開発 - パート 5 - 管理画面の追加 - ドキュメント / 開発者ガイド - Discourse Metaや他のプラグインを見ましたが、うまくいきませんでした。

カスタムルートはすべてJSONデータを返しますが、私はEmberのテンプレートをレンダリングしたいのです。これに関連する知識を説明している記事はありますか?よろしくお願いします。

やりたいことがそれだけなら、以下をご覧ください。

そして、以下もご覧ください。

「いいね!」 3

私は現在ここで立ち往生しています。以下に具体的な手順を示します。

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 のテンプレートをレンダリングするにはどうすればよいですか?

以前、後で読むためにブックマークしたトピックはこちらです: https://meta.discourse.org/t/creating-routes-in-discourse-and-showing-data/48827。最新かどうかはわかりませんが、まだ役に立つかもしれません。

はい、私もその投稿を読み、記載されている手順でインストールしましたが、うまくいきませんでした。「ページが存在しません」というエラーが表示されました。それで、途方に暮れています。

OK、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 にアクセスすると、以下のように表示されます。

「いいね!」 1