플러그인에서 버튼을 누른 후 텍스트박스 데이터를 가져오기

첫 번째 플러그인을 개발 중인데, 버튼을 누른 후 관리자 패널(플러그인의 일부)에 있는 텍스트 박스의 텍스트 콘텐츠를 가져오고 싶습니다. 그런 다음 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에서 호출할 수 있게 하는 것 같습니다. Ruby 측에서 관리자 권한 범위를 가진 사용자 입력 API를 구현한 Data Explorer 플러그인이 좋은 예시가 될 수 있습니다.

데이터 탐색기(Data Explorer)의 JS 코드는 다소 복잡한 편이라, 아마도 필요하실 내용을 간략화한 예시만 드리겠습니다.

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

...
  @action
  sendTextboxData() {
    ajax("/endpoint", {
        type: "POST",
        data: {
          key: "value"
        },
    }).then((result) => {
        // 결과에 대해 무언가를 수행합니다
    };
  }

네이티브 JS의 fetch()를 사용하여 동일한 작업을 수행할 수 있지만, discourse가 제공하는 ajax() 함수는 내부적으로 몇 가지 세부 사항을 처리해 주는 것으로 보입니다.

Ruby 코드가 충분히 가볍다면 컨트롤러를 단일 파일로 구성할 수 있을 것입니다. 그렇지 않다면 필요에 맞게 자유롭게 구성하시면 됩니다.