Generador de plugins para Rails

Parece un buen comienzo para mí. Ahora, solo necesito aprender a hacer cosas geniales con ello.

Mi primer plan es escribir algo de código para consultar la base de datos y obtener un valor que necesito de la tabla post_custom_fields, y usarlo en la página de temas para un pequeño requisito solicitado por nuestro equipo de moderadores veteranos.

Mañana lo descargaré de Git y comenzaré a buscar ejemplos de código de base de datos de otros plugins para empezar y ver qué tan lejos puedo llegar.

Gracias de nuevo, @j.jaffeux.

Cada pequeño aporte ayuda, y tener un generador como este para creadores novatos de plugins de Discourse como yo es muy apreciado. Pueden verlo allí abajo, en la parte inferior, rogando ser desarrollado:

A lo largo de los años, he escrito innumerables plugins para vBulletin, así que estoy realmente emocionado por crear algunos plugins sencillos para Discourse, créanme.

2 Me gusta

Hola @j.jaffeux

Sigo aprendiendo sobre los complementos de Discourse, así que hoy volví a este generador de complementos; y probé esto en un entorno de desarrollo en macOS, donde la aplicación funciona correctamente y he estado estudiando mucho Ruby y Rails, además de crear pequeños complementos para aprender:

# cd /var/Tim/Discourse/plugins
# rails g plugin DiscourseRacoon
# bundle exec 'rails s'

Todo parece ir bien y el complemento se instala correctamente:

Screen Shot 2020-08-11 at 1.26.36 PM

Pero cuando voy a la ruta:

http://localhost:3000/discourse_racoon

No funciona:

¿Estoy equivocado al pensar que las rutas del complemento y el controlador deberían funcionar automáticamente (OOTB) después de generar el complemento básico, en este caso DiscourseRacoon?

Consulté varias referencias en línea, que indicaban que deberíamos verificar que la ruta existiera; así que revisé routes.rb y hay rutas definidas allí; también revisé discourse_racoon_controller.rb y el controlador tiene un método index (acción).

Lo siento, aún estoy luchando con el desarrollo de complementos más interesantes y con Discourse. ¿Qué estoy haciendo mal? ¿Algún consejo sobre cuál debería ser mi siguiente paso para depurar esto?

Gracias.

1 me gusta

Es /discourse-racoon, no /discourse_racoon

rake routes | grep racoon

                         discourse_racoon          /discourse-racoon                                                           DiscourseRacoon::Engine
        GET  /                      discourse_racoon/discourse_racoon#index
acciones GET  /acciones(.:format)     discourse_racoon/actions#index
        GET  /acciones/:id(.:format) discourse_racoon/actions#show
5 Me gusta

Hola @j.jaffeux

¡Gracias!

Eso fue todo.

¿Supongo que es una convención de Rails que necesito aprender? ¿Dónde todas las rutas definidas con guiones bajos se acceden con guiones?

DiscourseRacoon::Engine.routes.draw do
  get "/" => "discourse_racoon#index", constraints: DiscourseRacoonConstraint.new
  get "/actions" => "actions#index", constraints: DiscourseRacoonConstraint.new
  get "/actions/:id" => "actions#show", constraints: DiscourseRacoonConstraint.new
end
1 me gusta

Hola,

Generé un plugin “hello world” con este generador, agregué varias instrucciones de Ruby para “escribir en un archivo” y observé el ciclo de vida de Rails. Descubrí que los controladores de Rails no funcionaban como se esperaba (no registraban nada, lo que indicaba que se estaban ignorando).

Tras depurar el código, logré que funcionara correctamente moviendo los controladores de Rails un nivel arriba en el directorio.

Además, agregué un controlador y una plantilla de JavaScript/Ember para la página de índice principal, incluí algo de HTML y CSS en todas las plantillas y añadí código JS para leer las cookies y resaltar las plantillas.

Por ejemplo, después de algunos cambios en el plugin generado por el generador de plugins de Rails:

http://localhost:3000/hello-world/

Para obtener todos los detalles y capturas de pantalla, consulta:

Para finalizar, quiero agradecer a @j.jaffeux por este generador de plugins de Rails. Me divertí mucho depurando los controladores de Rails y disfruté modificándolo para incluir más código que permita inspeccionar tanto el ciclo de vida de Rails como las plantillas y controladores de JS.

Espero que mis cambios sean útiles para cualquier otra persona que, como yo, aún esté aprendiendo los fundamentos de Discourse en el desarrollo de plugins en su tiempo libre y quiera utilizar el generador de plugins de Rails.

Ver también:

Actualmente, me estoy divirtiendo mucho depurando y corrigiendo plugins rotos como parte del proceso de aprendizaje del desarrollo de plugins en Rails y Discourse :slight_smile:

5 Me gusta

¡Gracias por resolver esto, @neounix! Quizás esto sea el impulso que necesito para poner mi proyecto en marcha.

Hola @j.jaffeux, ¿mover esos archivos es la Solución Recomendada, o deberían incluirse con algo como

  load File.expand_path('some-path-here', __dir__) 

Creo que intenté incluirlos, pero luego obtuve un error sobre algo que faltaba… (así que supongo que hice lo incorrecto y no vale la pena documentar exactamente qué).

EDITO: Parece que el controlador sí se carga/ejecuta al acceder a /plugin-path.

3 Me gusta

¡Hola @pfaffman!

Originalmente intenté cargar los controladores de Ruby con instrucciones load en plugin.rb, pero no registraban los datos como se esperaba.

Cuando probé los controladores de Ruby, utilicé instrucciones de Ruby para registrar en el sistema de archivos y ejecuté un tail -f en ese archivo de registro para verificar cómo se activaban los controladores.

Por diversión, terminé mi día de ayer escribiendo un código que lee todas las variables de entorno (ENV) del proceso y las guarda en una cookie mediante un controlador de Rails, para luego escribirlas en la aplicación con el controlador de Ember.

¡Muy divertido!

Estoy enganchado, jaja

3 Me gusta

La parte de la URL está en el lado izquierdo, la referencia al código Ruby está en el lado derecho de =>. La diferencia entre _ y - se define en la línea mount del motor.

4 Me gusta

En la Parte 4 de la guía de plugins de @eviltrout, se recomienda desarrollar el plugin fuera del código base de Discourse y configurar un enlace simbólico en el directorio plugins.

¿Tendría sentido añadir una opción -d ~/ruta/al/plugin_src para generar el plugin en un directorio diferente y, posiblemente, también configurar el enlace simbólico?

1 me gusta

Lo siento, pero es posible que deprecie esto y cierre el tema por ahora.

Aunque ofrece menos opciones de personalización, nuestra forma preferida de iniciar un plugin ahora es usar GitHub - discourse/discourse-plugin-skeleton: Template for Discourse plugins · GitHub como plantilla (consulta el botón verde USAR ESTA PLANTILLA).

Nos resulta mucho más fácil mantener esto actualizado.

6 Me gusta