プラグインでトピックガーディアンをカスタマイズ/オーバーライドする方法

カスタムロジックに基づいて、新規トピック作成が許可されていない各ユーザーに対して user_custom_fields テーブルにブール値を追加するプラグインの開発を進めています。

user.custom_fields['can_create_topic'] = false;

やりたいことは?
カスタムロジックに基づいて、一部のユーザーに対して「+ 新規トピック」ボタンを非表示にしたいと考えています。

質問
can_create_topic をカスタマイズして、guardianuser_custom_field を追加的にチェックし、ユーザーが新規トピックを作成できるかどうかを判定することは可能でしょうか?

「いいね!」 1

はい、もちろんプラグインを使って Ruby クラスを変更できます。これはソフトウェアであり、太陽帆やワームホールを使った銀河間宇宙旅行のような複雑なものではなく、プラグインを使って Discourse の動作を変更することは可能です:

お使いのユースケースはわかりませんが、その場合の簡単かつ安全な方法は、トピック作成権限を持つグループに該当ユーザーを追加または削除することです。

「いいね!」 2

@pfaffman それもいいアイデアですね。ただ、TopicGuardian の can_create_topic? メソッドをオーバーライドできれば、よりクリーンな解決策になると思います。同様の変更を取り入れているプラグインはありますか?

わからないのは、TopicGuardian が依存注入ではなくミックスインとして使用されているため、プラグインから TopicGuardian のサブクラスを作成して Guardian クラス内の TopicGuardian を置き換える方法です。

わかりました。答えが見つかったと思います。module ::TopicGuardiancan_create_topic? メソッドを実装するだけで、TopicGuardian の動作が自動的に変更され、どこかに注入したり登録したりする必要はありません。また、オーバーライドしたメソッド内で super メソッドを使用できるため、元のメソッドが変更された場合に常に手動で同期を保つ必要もなくなります。

以下のトピックで助けを得ました:Overriding user_guardian.rb in a plugin (no fork necessary!)

「いいね!」 2