Ich arbeite an meinem ersten Plugin und möchte nach dem Drücken einer Schaltfläche den Textinhalt eines Textfelds im Admin-Panel (Teil des Plugins) abrufen können. Dann möchte ich einige Dinge mit dem Inhalt in Ruby tun. Gibt es eine Möglichkeit, dass das Ember-Frontend Daten an das Ruby-Backend sendet?
Mein plugin.rb:
# name: Discourse Sample Plugin
# about: Ein einfaches Plugin zum Herumspielen
# version: 1.0.0
# authors: NateDhaliwal
# url: https://google.com
enabled_site_setting :plugin_enabled
add_admin_route 'sample_page.title', 'sample-page'
Discourse::Application.routes.append do
get '/admin/plugins/sample-page' => 'admin/plugins#index', constraints: StaffConstraint.new
end
import Controller from "@ember/controller";
import { action } from "@ember/object";
export default class AdminPluginsSamplePlugin extends Controller {
@action
sendTextboxData() {
// Wie sende ich die Daten?
}
}
Wenn es mir gelingt, die Daten an das Ruby-Backend zu senden, wo platziere ich die Logik für die Verarbeitung der Daten? In plugin.rb? Oder in einer anderen Datei?
Oder wäre eine Einstellung idealer? Mein Anwendungsfall ist jedoch, dass das Textfeld die Werte nicht jedes Mal beibehalten muss. Bietet yml diese Funktionalität? Kann ich Site-Einstellungen über Ruby ändern?
Es scheint, als ob Sie eine API in Ruby erstellen möchten, die von JS aufgerufen werden kann. Ein Beispiel ist das Data Explorer Plugin, das auf der Ruby-Seite eine Benutzereingabe-API mit Admin-Berechtigungsbereich implementiert.
Das JS für den Data Explorer ist ziemlich umfangreich, daher gebe ich nur ein vereinfachtes Beispiel dessen, was Sie wahrscheinlich benötigen werden.
import { ajax } from "discourse/lib/ajax";
...
@action
sendTextboxData() {
ajax("/endpoint", {
type: "POST",
data: {
key: "value"
},
}).then((result) => {
// do something with the result
};
}
Sie können dasselbe mit einem nativen JS fetch() tun, aber es scheint, dass die von Discourse bereitgestellte ajax()-Funktion einige kleinere Dinge im Hintergrund handhabt.
Wenn Ihr Ruby-Code leicht genug ist, können Sie ihn wahrscheinlich vollständig in einer einzigen Datei für den Controller unterbringen. Andernfalls können Sie ihn nach Bedarf organisieren.