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