シリアライザーツリーでの `scope:` の転送:実装すべきか否か?

シリアライザーには、パーミッションコンテキストを提供する scope: パラメーターを指定できます。Discourse のコードでは、指定されたスコープは Guardian であり、すべてのシリアライザーが Guardian をスコープとして受け取ることを意図しているようです。ApplicationController (すべてのコントローラーの基底クラス) は Guardian を維持しており、すべてのシリアライザーの scope: として Guardian が注入されることを保証するための複数のメカニズムがあります。

しかし、これらのメカニズムでカバーされていないシナリオも存在します。シリアライザーが明示的に構築される場合、たとえば ActiveModel::ArraySerializer.new(...) の呼び出しでは、スコープを手動で注入する必要があります。実際、XxxxSerializer.new(...) のほとんどのインスタンスには、引数リストに scope: scope または scope: guardian が含まれています。しかし、すべてではありません

そこで、私の質問は次のとおりです。開発哲学は何ですか?

  1. スコープは常に転送されるべきである (特定の理由がない限り)。誰かがそれを忘れた場合、それはバグの元であり、適切な scope: ... を追加して修正されるべきである。または
  2. はい、それは問題ありません。誰かが実際に誰かに問題を引き起こした場合に、その箇所を修正できます。

私の場合、BasicUserSerializerscope の使用を追加しました…そして、Chat で問題が発生し、ひどく困惑しました。最終的に (かなりの時間を費やして調査した結果)、シリアライザーのチェーン XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer のどこかでスコープが転送されていなかったことが原因だと気づきました。

「いいね!」 1