플러그인으로 토픽 가디언을 커스터마이즈/오버라이드하는 방법

사용자가 새 주제를 생성할 수 없는 경우, 사용자별로 user_custom_fields 테이블에 커스텀 로직에 기반한 불리언 값을 추가하는 플러그인을 개발하고 있습니다.

user.custom_fields['can_create_topic'] = false;

원하는 작업
커스텀 로직에 따라 일부 사용자에게 “+ New Topic” 버튼을 숨기고 싶습니다.

질문
can_create_topic을 커스터마이즈하여 guardian이 user_custom_field에 대한 추가 검사를 수행함으로써 사용자가 새 주제 생성을 허용되는지 여부를 판단할 수 있을까요?

네, 물론입니다. 플러그인을 사용하여 Ruby 클래스를 수정할 수 있습니다. 이것은 소프트웨어이며, 태양 돛이나 웜홀을 이용한 은하간 우주 여행처럼 어려운 것이 아니라 쉽게 수정할 수 있으므로, 플러그인을 통해 Discourse의 동작을 수정하는 것은 당연히 가능합니다:

사용 사례는 모르겠지만, 그걸 쉽게 안전하게 처리하는 방법은 주제 생성 권한이 있는 그룹에 해당 사용자를 추가하거나 제거하는 것입니다.

@pfaffman 그건 좋은 아이디어입니다. 하지만 TopicGuardian에서 can_create_topic? 메서드를 오버라이드할 수 있다면, 그게 더 깔끔한 해결책이 될 것 같습니다. 비슷한 변경 사항이 있는 플러그인이 있을까요?

제가 모르는 부분은, Guardian 클래스에서 TopicGuardian이 의존성 주입이 아닌 믹스인(mixin)으로 사용되고 있기 때문에, 플러그인의 TopicGuardian 하위 클래스를 어떻게 대체할 수 있는지가 궁금합니다.

좋아요. 답을 찾은 것 같습니다. module ::TopicGuardian에서 “can_create_topic?” 메서드를 구현하면, 어딘가에 주입하거나 등록할 필요 없이 TopicGuardian의 동작이 자동으로 변경됩니다. 또한, 오버라이드 메서드 안에서 super 메서드를 사용할 수 있으므로, 원본 메서드가 변경될 경우에도 항상 수동으로 동기화할 필요가 없습니다.

이 주제에서 도움을 받았습니다: Overriding user_guardian.rb in a plugin (no fork necessary!)