내가 파악/추론한 내용은 다음과 같습니다:
Guardian은 _“사용자가 무엇을 할 수 있는가?”_를 캡슐화하는 것이 맞습니다. (Guardian인스턴스에는User인스턴스도 포함됩니다.)- 따라서 권한 판정식(predicate)을 두는 적절한 위치는 단순히
Guardian의 메서드(lib/guardian.rb)입니다.- 해당 메서드가 "사용자가 특정 Xxxx 객체에 대해 Z 작업을 수행할 수 있는가?"를 묻는 것이라면,
XxxxGuardian믹스인 파일(lib/guardian/...) 중 하나에 속할 가능성이 높습니다. - 그렇지 않다면, 기본
Guardian정의에 넣어야 합니다.
- 해당 메서드가 "사용자가 특정 Xxxx 객체에 대해 Z 작업을 수행할 수 있는가?"를 묻는 것이라면,
ApplicationController는 현재 요청/클라이언트를 반영하는guardian속성을 관리하며, 이를 시리얼라이저(serializer)의scope로 제공합니다. 덕분에 필요할 때 현재Guardian을 사용할 수 있습니다([1]가 아닌 경우를 제외하고).- 시스템이 실행하는 백엔드 태스크와 같이 미리 만들어진
Guardian이 사용 불가능한 경우가 있습니다. 하지만 “행동하는 사용자(acting user)”(예: 이메일 알림을 생성할 때의 수신자)에 대한 참조를 가지고 있다면, 즉석에서 적절한 가디언을 생성할 수 있습니다:Guardian.new(the_user).