Exemple simple pour un plugin pour changer les fichiers ?

J’essaie d’écrire mes premiers plugins très basiques sur Discourse, après avoir beaucoup lu sur Ruby et les avantages que ce langage nous offre :slight_smile:

Je veux ajouter du texte à des pages spécifiques comme les badges, le classement (gamification) et des modifications simples similaires comme changer le comportement par défaut sur l’ordre des résultats de recherche, les derniers messages au lieu de la pertinence.

Je comprends que la meilleure approche est d’éviter de forker le cœur et d’écrire des plugins. Alors, où puis-je chercher si je veux modifier des fichiers spécifiques sur Discourse à partir d’un plugin ?

Nous pouvons prendre un exemple en modifiant ce fichier :

Comment dire à Discourse d’utiliser le plugin topic_embed.rb et de remplacer celui par défaut ?

2 « J'aime »

C’est une technique connue sous le nom de « monkey patching ». Il existe plusieurs façons d’y parvenir, mais le plus simple est de définir la méthode que vous souhaitez remplacer dans votre plugin.

after_initialize do
  class ::TopicEmbed
    def self.imported_from_html(url)
       # votre code
    end
  end
end
2 « J'aime »

Eh bien, nous sommes censés venir des singes, donc après tout, cela pourrait être une bonne chose à faire en suivant votre exemple :slight_smile:

Merci pour votre réponse ! J’essaie, mais que puis-je faire si je veux changer tout le fichier embed.rb ?

Je vois que cela ne peut être utilisé que pour remplacer une classe spécifique, mais je veux remplacer l’intégration en supprimant complètement les boutons et en affichant un simple onebox.

Je peux travailler sur le fichier, mais je ne sais pas comment mettre ce fichier dans Discourse sans forker (ce qui semble être du gorilla patching).

1 « J'aime »

Il y a tellement de matériel existant ici. Regardez tous les dizaines de plugins existants.

Voici un exemple de remplacement du système onebox :

Notez que le patching peut être très ciblé et intelligent (ce plugin ne l’est pas particulièrement ! Mais c’est en partie dû à la structure de ce code principal qui rend les remplacements nécessairement verbeux) et l’art consiste à faire le moins possible pour obtenir l’effet désiré : si vous proposez de remplacer des fichiers entiers, vous pourriez vouloir reconsidérer votre approche globale.

Et encore une fois, comme le dit Richard, vous ne remplacez presque jamais (en Ruby on Rails du moins) des fichiers entiers. Vous devez penser aux méthodes.

3 « J'aime »