按下插件中的按钮后获取文本框数据

我正在开发我的第一个插件,希望在按下按钮后能够获取管理面板(插件的一部分)中文本框中的文本内容。然后,我希望在 Ruby 中对内容进行一些操作。Ember 前端有办法将数据发送回 Ruby 后端吗?
我的 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

我的 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>

不确定 sendTextboxData 应该做什么。
我的 assets/javascripts/discourse/sample-page-route-map.js

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

我的 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() {
    // How do I send the data?
  }
}

如果我设法将数据发送到 Ruby 后端,我应该在哪里放置处理数据的逻辑?在 plugin.rb 中?还是其他文件?

或者设置更理想吗?但是,我的用例是文本框每次都不需要保留值。yml 是否提供此功能?我可以通过 Ruby 更改站点设置吗?

听起来您想创建一个 Ruby API 供 JS 调用。例如,Data Explorer 插件在 Ruby 端实现了一个具有管理员权限范围的用户输入 API。

Data Explorer 的 JS 部分比较复杂,因此我将提供一个简化的示例,说明您可能需要什么。

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

...
  @action
  sendTextboxData() {
    ajax("/endpoint", {
        type: "POST",
        data: {
          key: "value"
        },
    }).then((result) => {
        // do something with the result
    };
  }

您可以使用原生的 JS fetch() 来完成同样的事情,但 Discourse 提供的 ajax() 函数似乎在后台处理了一些小问题。

如果您的 Ruby 代码足够精简,您可能可以将其完全放入控制器的一个文件中。否则,您可以根据需要进行组织。

2 个赞