Резюме
В очереди на проверку (/review), если модератор редактирует теги у поста в очереди, а затем нажимает Одобрить, запрос на одобрение завершается ошибкой 500 Internal Server Error.
Шаги для воспроизведения
- Убедитесь, что в очереди на проверку есть пост (например, от пользователя/группы, требующих одобрения).
- Перейдите в
/review. - Откройте элемент в очереди.
- Отредактируйте теги с помощью интерфейса выбора тегов.
- Нажмите Одобрить.
- Убедитесь, что возвращается ответ 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!
