Obtenha os dados da caixa de texto após pressionar o botão no plugin

Estou trabalhando no meu primeiro plugin e quero poder obter o conteúdo de texto de uma caixa de texto no painel de administração (parte do plugin) após pressionar um botão. Em seguida, quero fazer algumas coisas com o conteúdo em Ruby. Existe uma maneira de o frontend Ember enviar dados de volta para o backend Ruby?
Meu plugin.rb:

# name: Discourse Sample Plugin
# about: Um plugin simples para brincar
# 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

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

Não tenho certeza do que sendTextboxData deveria fazer.
Meu assets/javascripts/discourse/sample-page-route-map.js:

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

Meu 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() {
    // Como eu envio os dados?
  }
}

Se eu conseguir enviar os dados para o backend Ruby, onde devo colocar a lógica para lidar com os dados? Em plugin.rb? Ou em outro arquivo?

Ou uma configuração seria mais ideal? No entanto, meu caso de uso é que a caixa de texto não precisará reter valores a cada vez. O yml oferece essa funcionalidade? Posso alterar as Configurações do Site através do Ruby?

Parece que o que você está procurando é criar uma API em Ruby que o JS possa chamar. Um exemplo é o plugin Data Explorer, que implementa uma API de entrada do usuário com escopo de permissão de administrador no lado Ruby.

O JS para o Data Explorer é um pouco mais robusto, então darei apenas um exemplo simplificado do que você provavelmente precisaria.

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

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

Você pode fazer a mesma coisa com um fetch() nativo do JS, mas parece que a função ajax() que o Discourse fornece lida com algumas pequenas coisas nos bastidores.

Se o seu código Ruby for leve o suficiente, você pode colocá-lo inteiramente em um único arquivo para o controller. Caso contrário, você pode organizá-lo como precisar.

2 curtidas