Ejemplo simple para un plugin para cambiar archivos?

Estoy intentando escribir mis primeros plugins muy básicos en Discourse, después de leer mucho sobre Ruby y los beneficios que el lenguaje nos ofrece :)\n\nQuiero añadir texto a páginas específicas como insignias, tabla de clasificación (gamificación) y ediciones simples similares como cambiar el comportamiento predeterminado en los resultados del orden de búsqueda, últimas publicaciones en lugar de relevancia.\n\nEntiendo que el mejor enfoque es evitar bifurcar el núcleo y escribir plugins. Entonces, ¿dónde puedo buscar si quiero cambiar archivos específicos en Discourse desde un plugin?\n\nPodemos tomar un ejemplo editando este archivo:\n\ndiscourse/app/models/topic_embed.rb at 5584fb1e3b7a29d7ee5d7e43520191081dd10a16 · discourse/discourse · GitHub decirle a Discourse que use el plugin topic_embed.rb y reemplace el predeterminado?*

2 Me gusta

Esta es una técnica conocida como “monkey patching”. Hay varias maneras de lograr esto, pero la más fácil es simplemente definir el método que deseas reemplazar en tu plugin.

after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # tu código
    end
  end
end
2 Me gusta

Bueno, se supone que venimos de monos, así que después de todo podría ser algo bueno de hacer siguiendo tu ejemplo :slight_smile:

¡Gracias por tu respuesta! Lo estoy probando, pero ¿qué puedo hacer si quiero cambiar todo el archivo embed.rb?

Veo que solo se puede usar para reemplazar una clase específica, pero quiero reemplazar el embed eliminando por completo los botones y mostrando un simple onebox.

Puedo trabajar en el archivo, pero no sé cómo poner ese archivo en Discourse sin hacer un fork (eso parece ser “gorilla patching”).

1 me gusta

Hay tanto material existente aquí. Solo mira todos los docenas de plugins existentes.

Aquí tienes un ejemplo de cómo anular el sistema de onebox:

Ten en cuenta que el parcheo puede ser muy específico e inteligente (¡este plugin no lo es particularmente! Pero eso se debe en parte a la estructura de este código principal que hace que las anulaciones sean necesariamente verbosas) y el arte consiste en hacer lo mínimo posible para lograr el efecto deseado: si propones anular archivos completos, es posible que quieras reconsiderar tu enfoque general.

Y de nuevo, según Richard, casi nunca (al menos en Ruby on Rails) se anulan archivos completos. Necesitas pensar en los métodos.

3 Me gusta