시리얼라이저는 scope: 매개변수를 통해 권한 컨텍스트를 제공할 수 있습니다. Discourse 코드에서 제공되는 scope는 Guardian이며, 모든 시리얼라이저가 Guardian을 scope로 수신하도록 의도되어 보입니다. ApplicationController(모든 컨트롤러의 기본 클래스)는 Guardian을 유지하며, 모든 시리얼라이저에 대해 Guardian이 scope:로 주입되도록 보장하기 위한 여러 메커니즘을 갖추고 있습니다.
그러나 모든 시나리오가 이러한 메커니즘에 의해 커버되는 것은 아닙니다. 시리얼라이저가 명시적으로 생성되는 경우, 예를 들어 ActiveModel::ArraySerializer.new(...)를 호출하는 경우와 같이, scope를 수동으로 주입해야 합니다. 실제로 XxxxSerializer.new(...)의 대부분은 인자 목록에 scope: scope 또는 scope: guardian을 포함하고 있습니다. 하지만 그렇지 않은 경우도 있습니다.
따라서 제 질문은 다음과 같습니다. 여기의 개발 철학은 무엇인가요?
- scope는 단순히 항상 전달되어야 하는가(특정 이유가 없는 한)? 누군가가 이를 놓쳤다면, 이는 잠재적 버그이며 적절한
scope: ...를 추가하여 수정해야 하는 것인가; 아니면 - 네, 괜찮다. 누군가가 실제로 문제를 일으킬 때 그 지점들을 찾아서 수정할 수 있다.
제 경우, BasicUserSerializer에 scope 사용을 추가했는데… Chat에서 문제가 발생하는 것을 발견했을 때 매우 당혹스러웠습니다. 나중에(너무 많은 조사 끝에) 이것이 XxxSerializer -> YyySerializer -> ... -> BasicUserSerializer 체인에 숨겨진 어떤 시리얼라이저가 scope를 전달하지 않은 결과임을 깨달았습니다.