Obtener datos del cuadro de texto después de presionar un botón en el plugin

Estoy trabajando en mi primer plugin y quiero poder obtener el contenido de texto de un cuadro de texto en el panel de administración (parte del plugin) después de presionar un botón. Luego, quiero hacer algunas cosas con el contenido en Ruby. ¿Hay alguna forma de que el frontend de Ember envíe datos al backend de Ruby?
Mi 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

Mi 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>

No estoy seguro de qué debería hacer sendTextboxData.
Mi assets/javascripts/discourse/sample-page-route-map.js:

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

Mi 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() {
    // ¿Cómo envío los datos?
  }
}

Si logro enviar los datos al backend de Ruby, ¿dónde pongo la lógica para tratar con los datos? ¿En plugin.rb? ¿O en algún otro archivo?

¿O sería más ideal una configuración? Sin embargo, mi caso de uso es que el cuadro de texto no necesitará conservar los valores cada vez. ¿El yml proporciona esta funcionalidad? ¿Puedo cambiar la configuración del sitio a través de Ruby?

Parece que lo que buscas es crear una API en Ruby a la que pueda llamar el JS. Un ejemplo es el plugin Data Explorer, que implementa una API de entrada de usuario con un ámbito de permiso de administrador en el lado de Ruby.

El JS del explorador de datos es bastante completo, así que solo daré un ejemplo simplificado de lo que probablemente necesitarías.

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

...
  @action
  sendTextboxData() {
    ajax("/endpoint", {
        type: "POST",
        data: {
          key: "value"
        },
    }).then((result) => {
        // haz algo con el resultado
    };
  }

Puedes hacer lo mismo con un fetch() nativo de JS, pero parece que la función ajax() que proporciona Discourse maneja algunas cosas menores internamente.

Si tu código Ruby es lo suficientemente ligero, probablemente puedas incluirlo completamente en un solo archivo para el controlador. De lo contrario, puedes organizarlo como necesites.

2 Me gusta