シリアライザーには、パーミッションコンテキストを提供する scope: パラメーターを指定できます。Discourse のコードでは、指定されたスコープは Guardian であり、すべてのシリアライザーが Guardian をスコープとして受け取ることを意図しているようです。ApplicationController (すべてのコントローラーの基底クラス) は Guardian を維持しており、すべてのシリアライザーの scope: として Guardian が注入されることを保証するための複数のメカニズムがあります。
しかし、これらのメカニズムでカバーされていないシナリオも存在します。シリアライザーが明示的に構築される場合、たとえば ActiveModel::ArraySerializer.new(...) の呼び出しでは、スコープを手動で注入する必要があります。実際、XxxxSerializer.new(...) のほとんどのインスタンスには、引数リストに scope: scope または scope: guardian が含まれています。しかし、すべてではありません。
そこで、私の質問は次のとおりです。開発哲学は何ですか?
- スコープは常に転送されるべきである (特定の理由がない限り)。誰かがそれを忘れた場合、それはバグの元であり、適切な
scope: ...を追加して修正されるべきである。または - はい、それは問題ありません。誰かが実際に誰かに問題を引き起こした場合に、その箇所を修正できます。
私の場合、BasicUserSerializer に scope の使用を追加しました…そして、Chat で問題が発生し、ひどく困惑しました。最終的に (かなりの時間を費やして調査した結果)、シリアライザーのチェーン XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer のどこかでスコープが転送されていなかったことが原因だと気づきました。