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

**URL:** https://meta.discourse.org/t/forwarding-the-scope-down-a-tree-of-serializers-just-do-it-or-not/353691
**Category:** Development
**Created:** [21.Февраль.2025 21:02:56 UTC](https://meta.discourse.org/t/forwarding-the-scope-down-a-tree-of-serializers-just-do-it-or-not/353691 "2025-02-21T21:02:56Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![mdoggydog](https://avatars.discourse-cdn.com/v4/letter/m/82dd89/32.png) [@mdoggydog](https://meta.discourse.org/u/mdoggydog)
#### Post date: [21.Февраль.2025 21:02:56 UTC](https://meta.discourse.org/t/forwarding-the-scope-down-a-tree-of-serializers-just-do-it-or-not/353691/1 "2025-02-21T21:02:56Z")

</div>

Сериализаторы могут получать параметр `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`, не передавал область видимости дальше!
