Передача `scope:` вниз по дереву сериализаторов: делать это или нет?

Сериализаторы могут получать параметр scope:, предназначенный для предоставления контекста прав доступа для сериализатора. В коде Discourse в качестве области видимости (scope) используется объект Guardian, и, похоже, каждый сериализатор должен получать Guardian в качестве своей области видимости. ApplicationController (базовый класс всех контроллеров) хранит объект Guardian и использует несколько механизмов, чтобы гарантировать, что Guardian передаётся как scope: для всех сериализаторов.

Однако эти механизмы не покрывают все возможные сценарии. В тех случаях, когда сериализатор создаётся явно, например, при вызове ActiveModel::ArraySerializer.new(...), область видимости необходимо передавать вручную. Действительно, в большинстве случаев вызова XxxxSerializer.new(...) в списке аргументов присутствует scope: scope или scope: guardian. Но не во всех.

Итак, мой вопрос: какова здесь философия разработки? Это:

  1. Область видимости должна всегда передаваться дальше (если нет конкретной причины не делать этого); если кто-то забыл это сделать, это потенциальная ошибка, которую следует исправить, добавив соответствующий параметр scope: ...; ИЛИ
  2. Да, это допустимо; эти места можно исправлять по мере их обнаружения, когда они действительно вызовут проблемы у кого-то.

В моём случае я добавил использование scope в BasicUserSerializer… и был крайне озадачен, когда обнаружил, что это сломало работу в Chat. В конце концов я понял (после слишком долгого поиска), что причиной стало то, что какой-то сериализатор, скрытый в цепочке XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer, не передавал область видимости дальше!

1 лайк