# Scalar tags 파라미터가 검토 대기열에 추가되면 승인 시 HTTP 500 오류 발생

**URL:** <https://meta.discourse.org/t/scalar-tags-parameter-accepted-into-review-queue-causes-http-500-on-approval/415474>\
**Category:** Bug\
**Created:** [10월 22, 2026, 2:18오후 UTC](https://meta.discourse.org/t/scalar-tags-parameter-accepted-into-review-queue-causes-http-500-on-approval/415474 "2026-10-22T14:18:18Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![scavin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/scavin/32/115938_2.png) [@scavin](https://meta.discourse.org/u/scavin)\
**Post date:** [10월 22, 2026, 2:18오후 UTC](https://meta.discourse.org/t/scalar-tags-parameter-accepted-into-review-queue-causes-http-500-on-approval/415474/1 "2026-10-22T14:18:18Z")

</div>

자체 호스팅 사이트에서 대기 중인 토픽을 승인하는 과정에서 HTTP 500 오류가 발생했습니다. 원인은 대기 중 기록에 `payload.tags = "macos"`(문자열)가 포함되어 있었기 때문입니다. 잘못된 형식의 값은 이미 `POST /posts` 요청에서 허용되어 있었습니다.

클라이언트는 태그를 배열로 전송해야 한다는 점을 이해하고 있습니다. 제가 보고하는 문제는 유효하지 않은 스칼라 값이 검토 큐에 수용되었다가 나중에 관리자가 게시물을 승인할 때에만 실패한다는 것입니다.

**버전:** `2026.10.0-latest`, 커밋 `3f2bf92368c78a7fa9a755f3d046adf35dd4459b`.

### 사고 증거

해당 게시물은 `approve_post_count` 설정으로 인해 승인이 필요했습니다.

2026-10-22 13:37:52 UTC 시점에, 원래의 Rails 요청 매개변수에는 이미 다음 내용이 포함되어 있었습니다:

```ruby
"tags" => "macos"

```

요청은 `POST /posts`였으며, 해당 액세스 로그에는 HTTP 200이 기록되었습니다. 제출된 매개변수 이름은 `title`, `raw`, `category`, `tags`였습니다.

대기 중인 검토 가능 항목(reviewable)을 읽어본 결과 다음과 같았습니다:

```json
{
  "type": "ReviewableQueuedPost",
  "status": 0,
  "version": 0,
  "topic_id": null,
  "payload": {
    "tags": "macos"
  }
}

```

이는 제목, 본문 및 사용자 정보를 생략한 관련 필드 발췌본입니다. 검토 UI에서는 태그가 다섯 개의 개별 문자(`m`, `a`, `c`, `o`, `s`)로 표시되었습니다.

승인(Approve) 버튼을 클릭하자 다음과 같은 예외가 발생했습니다(로그에서 5개의 그룹화된 발생 사례 확인):

```plaintext
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](https://github.com/discourse/discourse/blob/3f2bf92368c78a7fa9a755f3d046adf35dd4459b/app/controllers/posts_controller.rb#L1014-L1021)는 `params.permit(tags: %i[id name])`을 호출하지만 반환된 필터링된 매개변수를 사용하지 않습니다. 대신 `result[f] = params[f]`를 통해 원래 값을 할당합니다.
- [NewPostManager#enqueue](https://github.com/discourse/discourse/blob/3f2bf92368c78a7fa9a755f3d046adf35dd4459b/lib/new_post_manager.rb#L267-L287)는 `@args[:tags]`를 검토 가능 항목 payload에 직접 복사합니다.
- [ReviewableQueuedPost#create\_options](https://github.com/discourse/discourse/blob/3f2bf92368c78a7fa9a755f3d046adf35dd4459b/app/models/reviewable_queued_post.rb#L86-L95)는 값이 이미 Array일 경우에만 태그를 변환하며, 스칼라 문자열은 변경되지 않은 상태로 두어둡니다.
- [DiscourseTagging.tags\_for\_saving](https://github.com/discourse/discourse/blob/3f2bf92368c78a7fa9a755f3d046adf35dd4459b/lib/discourse_tagging.rb#L926-L935)는 승인 사용자가 태그를 생성할 수 있는 경우 `tags_arg - tag_names`를 평가하는데, 이는 문자열에 대해 예외를 발생시킵니다.

### 기대되는 동작

검토 가능 항목을 생성하기 전에 스칼라 `tags` 매개변수에 대해 명확한 검증 오류를 반환하거나, 이것이 의도된 호환성 동작이라면 이를 정규화(normalize)해야 합니다. 기존에 잘못 형성된 검토 가능 항목도 관리 작업 중 처리되지 않은 500 오류를 일으키지 않고 적절히 실패해야 합니다.

### 우회 방법 및 이 보고서의 한계

검토 가능 항목을 편집하여 이전 태그를 제거하고, 기존 `macos` 태그를 선택한 후 저장하면 `payload.tags`가 태그 객체의 배열로 변경됩니다. 다시 읽기를 확인한 결과 버전 1, 여전히 대기 중 상태이며, UI에는 다시 하나의 태그만 표시됩니다. 그 변경 이후에 승인을 재시도하지는 않았습니다.

원래 제출자의 클라이언트는 알 수 없습니다. 이 보고서는 네이티브 작성기(composer)가 스칼라 태그를 생성한다는 것을 **증명하지** 않습니다. 실제 요청, 저장된 검토 가능 항목, 예외 및 검사된 코드를 기반으로 하며, 깨끗한 설치 환경에서 별도로 재현하지는 않았습니다.

개발용 재현을 위해 테스트해야 할 경로는 다음과 같습니다: 스태프가 아닌 사용자의 게시물에 대해 승인을 요구하도록 설정하고, 스칼라 `tags: "macos"`와 기타 유효한 필드를 포함하여 `POST /posts`를 제출한 다음, 관리자로서 생성된 대기 중 게시물을 승인합니다.

[같은 String 뺄셈 예외에 대한 이전 API 논의](https://meta.discourse.org/t/how-find-tags-id-to-add-tags-when-create-topic-via-api/84387/3)가 있습니다. 이 보고서는 잘못된 값이 검토 큐에 수용되어 나중에 승인 과정을 깨뜨리는 문제에 초점을 맞추고 있습니다.

---

<div class="post-metadata">

**Author:** ![sam](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/sam/32/102149_2.png) [@sam](https://meta.discourse.org/u/sam)\
**Post date:** [10월 23, 2026, 12:51오전 UTC](https://meta.discourse.org/t/scalar-tags-parameter-accepted-into-review-queue-causes-http-500-on-approval/415474/2 "2026-10-23T00:51:06Z")

</div>

솔직히 이게 어디서 나온 건지 확실하지 않지만, 이것을 금지하기 위한 수정 사항입니다.

> <https://github.com/discourse/discourse/pull/44990>
>
> Validate tag parameters before queuing and again when approving queued
> posts, pr…eventing malformed scalar values from bypassing input checks.
> Keep blank tag values valid for topic creation.
