자체 호스팅 사이트에서 대기 중인 토픽을 승인하는 과정에서 HTTP 500 오류가 발생했습니다. 원인은 대기 중 기록에 payload.tags = "macos"(문자열)가 포함되어 있었기 때문입니다. 잘못된 형식의 값은 이미 POST /posts 요청에서 허용되어 있었습니다.
클라이언트는 태그를 배열로 전송해야 한다는 점을 이해하고 있습니다. 제가 보고하는 문제는 유효하지 않은 스칼라 값이 검토 큐에 수용되었다가 나중에 관리자가 게시물을 승인할 때에만 실패한다는 것입니다.
버전: 2026.10.0-latest, 커밋 3f2bf92368c78a7fa9a755f3d046adf35dd4459b.
사고 증거
해당 게시물은 approve_post_count 설정으로 인해 승인이 필요했습니다.
2026-10-22 13:37:52 UTC 시점에, 원래의 Rails 요청 매개변수에는 이미 다음 내용이 포함되어 있었습니다:
"tags" => "macos"
요청은 POST /posts였으며, 해당 액세스 로그에는 HTTP 200이 기록되었습니다. 제출된 매개변수 이름은 title, raw, category, tags였습니다.
대기 중인 검토 가능 항목(reviewable)을 읽어본 결과 다음과 같았습니다:
{
"type": "ReviewableQueuedPost",
"status": 0,
"version": 0,
"topic_id": null,
"payload": {
"tags": "macos"
}
}
이는 제목, 본문 및 사용자 정보를 생략한 관련 필드 발췌본입니다. 검토 UI에서는 태그가 다섯 개의 개별 문자(m, a, c, o, s)로 표시되었습니다.
승인(Approve) 버튼을 클릭하자 다음과 같은 예외가 발생했습니다(로그에서 5개의 그룹화된 발생 사례 확인):
NoMethodError (undefined method '-' for an instance of String)
lib/discourse_tagging.rb:932:in 'DiscourseTagging.tags_for_saving'
lib/discourse_tagging.rb:43:in 'DiscourseTagging.tag_topic_by_names'
lib/discourse_tagging.rb:30:in 'DiscourseTagging.tag_topic'
lib/topic_creator.rb:228:in 'TopicCreator#setup_tags'
lib/topic_creator.rb:60:in 'TopicCreator#create'
lib/post_creator.rb:519:in 'PostCreator#create_topic'
lib/post_creator.rb:209:in 'block in PostCreator#create'
lib/post_creator.rb:419:in 'block in PostCreator#transaction'
lib/post_creator.rb:419:in 'PostCreator#transaction'
lib/post_creator.rb:207:in 'PostCreator#create'
app/models/reviewable_queued_post.rb:110:in 'ReviewableQueuedPost#perform_approve_post'
app/models/reviewable.rb:433:in 'Kernel#public_send'
app/models/reviewable.rb:433:in 'block in Reviewable#perform'
app/models/reviewable.rb:431:in 'Reviewable#perform'
app/controllers/reviewables_controller.rb:287:in 'ReviewablesController#perform'
관련 코드
downloading container에서 위 커밋 기준으로 확인한 코드 경로입니다:
- PostsController#create_params는
params.permit(tags: %i[id name])을 호출하지만 반환된 필터링된 매개변수를 사용하지 않습니다. 대신result[f] = params[f]를 통해 원래 값을 할당합니다. - NewPostManager#enqueue는
@args[:tags]를 검토 가능 항목 payload에 직접 복사합니다. - ReviewableQueuedPost#create_options는 값이 이미 Array일 경우에만 태그를 변환하며, 스칼라 문자열은 변경되지 않은 상태로 두어둡니다.
- DiscourseTagging.tags_for_saving는 승인 사용자가 태그를 생성할 수 있는 경우
tags_arg - tag_names를 평가하는데, 이는 문자열에 대해 예외를 발생시킵니다.
기대되는 동작
검토 가능 항목을 생성하기 전에 스칼라 tags 매개변수에 대해 명확한 검증 오류를 반환하거나, 이것이 의도된 호환성 동작이라면 이를 정규화(normalize)해야 합니다. 기존에 잘못 형성된 검토 가능 항목도 관리 작업 중 처리되지 않은 500 오류를 일으키지 않고 적절히 실패해야 합니다.
우회 방법 및 이 보고서의 한계
검토 가능 항목을 편집하여 이전 태그를 제거하고, 기존 macos 태그를 선택한 후 저장하면 payload.tags가 태그 객체의 배열로 변경됩니다. 다시 읽기를 확인한 결과 버전 1, 여전히 대기 중 상태이며, UI에는 다시 하나의 태그만 표시됩니다. 그 변경 이후에 승인을 재시도하지는 않았습니다.
원래 제출자의 클라이언트는 알 수 없습니다. 이 보고서는 네이티브 작성기(composer)가 스칼라 태그를 생성한다는 것을 증명하지 않습니다. 실제 요청, 저장된 검토 가능 항목, 예외 및 검사된 코드를 기반으로 하며, 깨끗한 설치 환경에서 별도로 재현하지는 않았습니다.
개발용 재현을 위해 테스트해야 할 경로는 다음과 같습니다: 스태프가 아닌 사용자의 게시물에 대해 승인을 요구하도록 설정하고, 스칼라 tags: "macos"와 기타 유효한 필드를 포함하여 POST /posts를 제출한 다음, 관리자로서 생성된 대기 중 게시물을 승인합니다.
같은 String 뺄셈 예외에 대한 이전 API 논의가 있습니다. 이 보고서는 잘못된 값이 검토 큐에 수용되어 나중에 승인 과정을 깨뜨리는 문제에 초점을 맞추고 있습니다.