Ich lasse ein Plugin entwickeln, das basierend auf einer benutzerdefinierten Logik einen booleschen Wert in die Tabelle user_custom_fields für jeden Benutzer einfügt, der keine neuen Themen erstellen darf.
user.custom_fields['can_create_topic'] = false;
Was möchte ich erreichen?
Ich möchte die Schaltfläche “+ Neues Thema” für bestimmte Benutzer basierend auf einer benutzerdefinierten Logik ausblenden.
Frage
Ist es möglich, can_create_topic in Guardian so anzupassen, dass eine zusätzliche Prüfung auf ein user_custom_field erfolgt, um zu bestimmen, ob ein Benutzer ein neues Thema erstellen darf oder nicht?
Ja, natürlich kannst du Ruby-Klassen mit Plugins ändern. Es ist Software, leicht zu modifizieren, keine intergalaktische Raumfahrt mit Sonnensegeln oder Wurmlöchern. Daher ist es selbstverständlich möglich, das Verhalten von Discourse mit einem Plugin anzupassen:
Ich kenne deinen Use Case nicht, aber der einfache und sichere Weg, das zu tun, wäre, diese Benutzer in eine Gruppe mit der Berechtigung, ein Thema zu erstellen, aufzunehmen oder daraus zu entfernen.
@pfaffman Das ist auch eine gute Idee. Aber ich denke, wenn ich die Methode can_create_topic? in der TopicGuardian überschreiben könnte, wäre das eine sauberere Lösung. Gibt es ein Plugin, auf das ich mich beziehen kann, das eine ähnliche Änderung enthält?
Was ich nicht weiß, ist, wie ich meine TopicGuardian als Unterklasse des Plugins erstellen kann, um die TopicGuardian in der Guardian-Klasse zu ersetzen, da sie gemischt wird und nicht per Dependency Injection bereitgestellt wird.
Okay. Ich glaube, ich habe meine Antwort gefunden. Ich muss lediglich die Methode “can_create_topic?” im module ::TopicGuardian implementieren, und das Verhalten von TopicGuardian ändert sich automatisch, ohne dass ich es irgendwo injizieren oder registrieren muss. Außerdem kann ich in meiner überschreibenden Methode die super-Methode verwenden, sodass ich sie nicht ständig manuell mit der Originalmethode synchron halten muss, falls diese geändert wird.