Ottieni i dati della casella di testo dopo aver premuto il pulsante nel plugin

Sto lavorando al mio primo plugin e voglio essere in grado di ottenere il contenuto testuale di una casella di testo nel pannello di amministrazione (parte del plugin) dopo aver premuto un pulsante. Quindi, voglio fare alcune cose con il contenuto in Ruby. C’è un modo per il frontend Ember di inviare dati al backend Ruby?
Il mio plugin.rb:

# name: Discourse Sample Plugin
# about: A simple plugin to play around with
# 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

Il mio assets/javascripts/discourse/templates/admin/plugin-sample-plugin.hbs:

<div class="textbox">
  <input id="textbox-data" type="text" />
</div>

<div class="buttons">
  <DButton
    @label="sample_page.send"
    @action={{action "sendTextboxData"}}
    @icon="arrow-right"
    @id="send-textbox-data"
  />
</div>

Non sono sicuro di cosa dovrebbe fare sendTextboxData.
Il mio assets/javascripts/discourse/sample-page-route-map.js:

export default {
  resource: 'admin.adminPlugins',
  path: '/plugins',
  map() {
    this.route('sample-page');
  }
};

Il mio assets/javascripts/discourse/controllers/admin-plugins-sample-plugin.js.es6:

import Controller from "@ember/controller";
import { action } from "@ember/object";

export default class AdminPluginsSamplePlugin extends Controller {

  @action
  sendTextboxData() {
    // Come invio i dati?
  }
}

Se riesco a inviare i dati al backend Ruby, dove metto la logica per gestire i dati? In plugin.rb? O in qualche altro file?

O una impostazione sarebbe più ideale? Tuttavia, il mio caso d’uso è che la casella di testo non avrà bisogno di conservare i valori ogni volta. Lo yml fornisce questa funzionalità? Posso modificare le impostazioni del sito tramite Ruby?

Sembra che quello che stai cercando sia creare un’API in Ruby che il JS possa chiamare. Un esempio è il plugin Data Explorer, che implementa un’API di input utente con ambito di autorizzazione amministrativa sul lato Ruby.

Il JS per il data explorer è piuttosto corposo, quindi fornirò solo un esempio semplificato di ciò di cui probabilmente avresti bisogno.

import { ajax } from "discourse/lib/ajax";

...
  @action
  sendTextboxData() {
    ajax("/endpoint", {
        type: "POST",
        data: {
          key: "value"
        },
    }).then((result) => {
        // fai qualcosa con il risultato
    };
  }

Puoi fare la stessa cosa con un fetch() nativo di JS, ma sembra che la funzione ajax() fornita da Discourse gestisca alcune piccole cose a livello di codice.

Se il tuo codice Ruby è abbastanza leggero, puoi probabilmente inserirlo interamente in un unico file per il controller. Altrimenti, puoi organizzarlo come preferisci.

2 Mi Piace