Ошибка 500 при одобрении поста на модерации после редактирования тегов в /review (теги сохраняются как объекты, а не строки)

Резюме

В очереди на проверку (/review), если модератор редактирует теги у поста в очереди, а затем нажимает Одобрить, запрос на одобрение завершается ошибкой 500 Internal Server Error.


Шаги для воспроизведения

  1. Убедитесь, что в очереди на проверку есть пост (например, от пользователя/группы, требующих одобрения).
  2. Перейдите в /review.
  3. Откройте элемент в очереди.
  4. Отредактируйте теги с помощью интерфейса выбора тегов.
  5. Нажмите Одобрить.
  6. Убедитесь, что возвращается ответ 500.

Ожидаемое поведение

Пост должен быть успешно одобрен, а обновленные теги применены.


Фактическое поведение

Одобрение завершается ошибкой 500.

Пример шаблона запроса:

PUT /review/{id}/perform/approve_post?version={x} → 500 (Internal Server Error)

Что, по-видимому, происходит (корневая причина)

После редактирования тегов в интерфейсе проверки полезная нагрузка объекта проверки сохраняет полные объекты тегов вместо строк с названиями тегов.

До редактирования тегов:

payload["tags"] = ["tag-one", "tag-two"]

После редактирования тегов в /review:

payload["tags"] = [
  {"id"=>123, "name"=>"tag-one", "description"=>nil, "count"=>50, ...},
  {"id"=>456, "name"=>"tag-two", "description"=>nil, "count"=>30, ...}
]

При обработке тегов действие одобрения, по-видимому, ожидает строки, но получает хеши/объекты, что приводит к ошибке 500.


Обходное решение

Нормализуйте теги обратно к названиям:

r = ReviewableQueuedPost.find(ID)
r.payload["tags"] = r.payload["tags"].map { |t| t.is_a?(Hash) ? t["name"] : t }
r.save!

1 лайк

Спасибо за сообщение. Мы всё проверим.

3 лайка

Это будет исправлено в FIX: Cater for reviewable tag payloads that have been saved as names by nattsw · Pull Request #37477 · discourse/discourse · GitHub. Большое спасибо за оперативный отчет об ошибке.

4 лайка

Эта тема была автоматически закрыта через 2 дня. Новые ответы больше не принимаются.