Discourse 게임화 - /leaderboard 경로에서 404 / MissingAttributeError 발생

최근 게이미피케이션을 활성화하기로 결정한 후, /leaderboard 라우트가 404 오류를 반환하는 문제를 즉시 마주하게 되었습니다. 백엔드에는 80만 개 이상의 점수 기록이 계산되어 있었고 권한 설정도 정상이었지만, 페이지 자체는 로드되지 않았습니다.

서버 로그를 확인해 보니 다음과 같은 내용이 표시되었습니다:
ActiveModel::MissingAttributeError (missing attribute 'admin' for User)

플러그인 코드를 살펴보다가 lib/discourse_gamification/leaderboard_cached_view.rb 파일에서 리더보드를 위해 컬럼을 가져오는 특정 .select 문자열을 사용한다는 것을 알게 되었습니다:

.select(
"users.id, users.name, users.username, users.uploaded_avatar_id, p.total_score, p.position",
)

users.adminusers.moderator가 해당 쿼리에 포함되지 않아서, 인스턴스화된 사용자 객체에는 해당 필드가 사용 가능하지 않습니다. 직렬화 과정이나 코어 레이아웃 렌더링 중에 해당 사용자에 대한 스태프 체크가 트리거되는 것으로 보이는데(아마도?), 이로 인해 Rails가 MissingAttributeError를 발생시키고 404로 폴백 처리되는 것 같습니다.

해당 파일을 수동으로 편집하여 .select 블록에 users.adminusers.moderator를 포함시켰습니다:

.select(
  "users.id, users.name, users.username, users.uploaded_avatar_id, users.admin, users.moderator, p.total_score, p.position",
)

앱 컨테이너를 재시작한 후 리더보드가 완벽하게 로드되기 시작했습니다.

이것이 버그인 것 같은데(아마도?), 아니면 제가 무언가를 완전히 오해하거나 놓치고 있는 걸까요?

현재 사이트는 v2026.6.0-latest (47a830330f) 버전을 사용 중입니다.

2개의 좋아요

보여 주신 에러와 설명은 일치합니다. 불행히도 47a830330f 또는 main에서 해당 문제를 재현할 수 없었습니다. 관리자 계정으로 로그인하여 시도해 보았고 일반 사용자로도 시도해 보았는데, 둘 다 정상적으로 로드되었습니다.

확인 차, 현재 Discourse 코어에 번들된 버전의 gamification을 사용 중이시며, 구버전의 독립형 플러그인은 설치되어 있지 않은지 확인 부탁드립니다.

MissingAttributeError가 발생하는 지점에 대한 스택 트레이스를 더 자세히 제공해 주실 수 있으신가요?

1개의 좋아요

@ted,

실제로는 이 메시지를 무시하셔도 됩니다. 결국 문제를 UserScoreSerializer에 연결된 플러그인으로 추적했습니다. 해당 플러그인은 자체적으로 좁은 범위의 .select() 문장을 구현하고 있었습니다. /logsMissingAttributeError에 대한 백트레이스가 제공되지 않아 처음에는 파악하기 어려웠습니다. rails를 통해 수동으로 호출하여 전체 스택 트레이스를 얻은 후에야 해당 문제를 일으킨 플러그인을 정확히 파악할 수 있었습니다.

도와주셔서 감사합니다. 그리고 오보로 인해 죄송합니다!

2개의 좋아요

괜찮습니다! 문제가 있으셨으니 올려주신 거고, 해결되어서 기쁩니다. :slightly_smiling_face: