Crear un plugin en Discourse puede ser realmente sencillo, una vez que aprendes algunos detalles particulares. El objetivo de esta publicación es crear un plugin básico y presentarte los conceptos fundamentales.
Tu entorno de desarrollo
Asegúrate de tener un entorno de desarrollo de Discourse ejecutándose en tu computadora. Te recomiendo que sigas la guía de configuración correspondiente y regreses cuando hayas terminado.
plugin.rb
Usa GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub para crear un esqueleto completo de un plugin de Discourse en tu directorio de plugins
El esqueleto ahora está integrado en el núcleo de Discourse; ejecutar
rake plugin:create[nombre-del-plugin]creará un plugin utilizando dicho esqueleto.
Cuando Discourse se inicia, busca en el directorio plugins subdirectorios que contengan un archivo plugin.rb. El archivo plugin.rb tiene dos propósitos: actúa como manifiesto de tu plugin con la información requerida sobre este, incluyendo su nombre, información de contacto y una descripción. El segundo propósito es inicializar cualquier código Ruby necesario para ejecutar tu plugin.
En nuestro caso, no añadiremos código Ruby, pero aún necesitamos el archivo plugin.rb. Creemos el directorio basic-plugin con el archivo plugin.rb dentro, con el siguiente contenido:
basic-plugin/plugin.rb
# name: basic-plugin
# about: Un plugin súper simple para demostrar cómo funcionan los plugins
# version: 0.0.1
# authors: Awesome Plugin Developer
# url: https://github.com/yourusername/basic-plugin
Una vez que hayas creado este archivo, deberías reiniciar tu servidor local y el plugin debería cargarse.
¡Una advertencia importante!
Si estás acostumbrado al desarrollo tradicional con Rails, notarás que los plugins no son tan convenientes en cuanto a la recarga. Por lo general, cuando haces cambios en tu plugin, deberías presionar Ctrl+c para detener el servidor y luego volver a ejecutarlo usando bin/dev.
¡Mis cambios no se aplicaron! 
A veces, la caché no se borra por completo, especialmente cuando creas nuevos archivos o eliminas antiguos. Para solucionar este problema, elimina tu carpeta tmp y vuelve a iniciar Rails. En Mac, puedes hacerlo con un solo comando: rm -rf tmp; bin/dev.
Verificar que tu plugin se cargó
Una vez que hayas reiniciado tu servidor local, visita la URL /admin/plugins (asegúrate de iniciar sesión con una cuenta de administrador primero, ya que solo los administradores pueden ver el registro de plugins).
Si todo funcionó correctamente, deberías ver tu plugin en la lista:
¡Felicidades, acabas de crear tu primer plugin!
Agreguemos algo de JavaScript
Por ahora, tu plugin no hace nada. Agreguemos un archivo JavaScript que muestre un cuadro de alerta cuando Discourse se cargue. Esto será muy molesto para cualquier usuario y no se recomienda como un plugin real, pero mostrará cómo insertar JavaScript en nuestra aplicación en ejecución.
Crea el siguiente archivo:
plugins/basic-plugin/assets/javascripts/discourse/initializers/alert.js
export default {
name: "alert",
initialize() {
alert("¡los cuadros de alerta son molestos!");
},
};
Ahora, si reinicias tu servidor local, deberías ver “¡los cuadros de alerta son molestos!” aparecer en la pantalla. (Si no fue así, consulta el encabezado “¡Mis cambios no se aplicaron!” más arriba).
Analicemos cómo funcionó esto:
-
Los archivos JavaScript colocados en
assets/javascripts/discourse/initializersse ejecutan automáticamente cuando se carga la aplicación Discourse. -
Este archivo en particular exporta un objeto, que tiene un
name(nombre) y una funcióninitialize(inicializar). -
El
namedebe ser único, así que simplemente lo llaméalert. -
La función
initialize()se llama cuando la aplicación se carga. En nuestro caso, lo único que hace es ejecutar nuestro códigoalert().
¡Ahora eres un desarrollador oficial de plugins de Discourse!
Más en la serie
Parte 1: Este tema
Parte 2: Plugin Outlets
Parte 3: Configuraciones del sitio
Parte 4: Configuración de git
Parte 5: Interfaces de administración
Parte 6: Pruebas de aceptación
Parte 7: Publica tu plugin
Este documento está controlado por versiones: sugiere cambios en GitHub.

