我正在开发我的第一个插件,希望在按下按钮后能够获取管理面板(插件的一部分)中文本框中的文本内容。然后,我希望在 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 更改站点设置吗?
Alteras
(Steven Chang)
2024 年11 月 23 日 21:05
3
听起来您想创建一个 Ruby API 供 JS 调用。例如,Data Explorer 插件在 Ruby 端实现了一个具有管理员权限范围的用户输入 API。
DiscourseDataExplorer::Engine.routes.draw do
root to: "query#index"
get "queries" => "query#index"
get "queries/:id" => "query#show"
scope "/", defaults: { format: :json } do
get "schema" => "query#schema"
get "groups" => "query#groups"
post "queries" => "query#create"
put "queries/:id" => "query#update"
delete "queries/:id" => "query#destroy"
post "queries/:id/run" => "query#run", :constraints => { format: /(json|csv)/ }
end
end
# frozen_string_literal: true
module ::DiscourseDataExplorer
class QueryController < ApplicationController
requires_plugin PLUGIN_NAME
before_action :set_group, only: %i[group_reports_index group_reports_show group_reports_run]
before_action :set_query, only: %i[group_reports_show group_reports_run show update]
before_action :ensure_admin
skip_before_action :check_xhr, only: %i[show group_reports_run run]
skip_before_action :ensure_admin,
only: %i[group_reports_index group_reports_show group_reports_run]
def index
queries = Query.where(hidden: false).order(:last_run_at, :name).includes(:groups).to_a
database_queries_ids = Query.pluck(:id)
Queries.default.each do |params|
attributes = params.last
This file has been truncated. show original
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 个赞