Я заказываю разработку плагина, который будет добавлять булево значение на основе пользовательской логики в таблицу user_custom_fields для каждого пользователя, которому не разрешено создавать новую тему.
user.custom_fields['can_create_topic'] = false;
Что я хочу сделать?
Я хочу скрыть кнопку «+ Новая тема» для некоторых пользователей на основе пользовательской логики.
Вопрос
Возможно ли настроить can_create_topic в guardian так, чтобы он выполнял дополнительную проверку поля user_custom_field для определения, разрешено ли пользователю создавать новую тему или нет?
Да, конечно, вы можете изменять классы Ruby с помощью плагинов. Это программное обеспечение, его легко модифицировать, а не межгалактические полёты с использованием солнечных парусов или кротовых нор, поэтому, разумеется, можно изменить поведение Discourse с помощью плагина:
Я не знаю ваш конкретный случай использования, но самый простой и безопасный способ сделать это — добавить или удалить этих пользователей из группы, имеющей разрешение на создание тем.
@pfaffman Это тоже хорошая идея. Но я думаю, что если я смогу переопределить метод can_create_topic? в TopicGuardian, это будет более чистым решением. Есть ли какой-нибудь плагин, на который я могу опереться, где есть похожее изменение?
Я не знаю, как сделать так, чтобы мой подкласс TopicGuardian из плагина заменил TopicGuardian в классе Guardian, так как он подключается через миксин, а не внедряется как зависимость.
Хорошо. Кажется, я нашёл ответ. Мне нужно просто реализовать метод can_create_topic? в модуле ::TopicGuardian, и это автоматически изменит поведение TopicGuardian без необходимости его внедрения или регистрации где-либо ещё. Кроме того, я могу использовать метод super внутри своего переопределённого метода, чтобы не приходилось вручную синхронизировать его с оригинальным методом на случай его изменения.