Comment personnaliser / remplacer le gardien de sujet via un plugin

Je fais développer un plugin qui ajoutera une valeur booléenne basée sur une logique personnalisée à la table user_custom_fields pour chaque utilisateur non autorisé à créer un nouveau sujet.

user.custom_fields['can_create_topic'] = false;

Ce que je souhaite faire ?
Je veux masquer le bouton “+ Nouveau sujet” pour certains utilisateurs en fonction d’une logique personnalisée.

Question
Est-il possible de personnaliser can_create_topic dans guardian afin qu’il effectue une vérification supplémentaire sur un champ personnalisé (user_custom_field) pour déterminer si un utilisateur est autorisé à créer un nouveau sujet ou non ?

1 « J'aime »

Oui, bien sûr, vous pouvez modifier les classes Ruby avec des plugins. C’est un logiciel, facilement modifiable, pas un voyage intergalactique utilisant des voiles solaires ou des trous de ver, donc bien sûr, il est possible de modifier le comportement de Discourse avec un plugin :

Je ne connais pas votre cas d’usage, mais la méthode simple et sûre pour le faire consisterait à ajouter ou supprimer ces utilisateurs d’un groupe disposant de la permission de créer un sujet.

2 « J'aime »

@pfaffman C’est aussi une bonne idée. Mais je pense que si je pouvais surcharger la méthode can_create_topic? dans TopicGuardian, ce serait une solution plus propre. Existe-t-il un plugin auquel je pourrais me référer qui présente une modification similaire ?

Ce que je ne sais pas, c’est comment faire en sorte que mon sous-classe de TopicGuardian issue du plugin remplace TopicGuardian dans la classe Guardian, car elle est incluse plutôt que injectée par dépendance.

D’accord. Je pense avoir trouvé la réponse. Il me suffit d’implémenter la méthode can_create_topic? dans module ::TopicGuardian, ce qui modifiera automatiquement le comportement de TopicGuardian sans avoir besoin de l’injecter ou de l’enregistrer quelque part. De plus, je peux utiliser la méthode super à l’intérieur de ma méthode de redéfinition, afin de ne pas avoir à la maintenir manuellement en synchronisation avec la méthode originale au cas où celle-ci changerait.

J’ai obtenu de l’aide grâce à ce sujet : Overriding user_guardian.rb in a plugin (no fork necessary!)

2 « J'aime »