CodeSOD: Когда ложь — это прав... Заметка
The Daily WTF на русском

CodeSOD: Когда ложь — это правда

Лилит интегрировала новые инструменты в API Ruby on Rails, который имел функцию "dry_run". Эта функция позволяла сервисам рассчитывать изменения без их применения. Возникла проблема, поскольку новый инструмент отправлял {"dry_run": false} в формате JSON, но сервис интерпретировал это как true. Такое неожиданное поведение было вызвано вспомогательным методом param_true?, предназначенным для обработки строковых или нулевых входных данных. Логика метода, в частности !param_value, некорректно оценивала фактическое булево значение false как true. Эта проблема, вероятно, оставалась незамеченной до тех пор, пока POST/PATCH/PUT запросы не начали отправлять тела JSON с булевыми значениями. Ранее GET запросы, вероятно, отправляли только строковые представления параметров. Также было отмечено как неудобство избыточная проверка метода params.key?(param_name) после получения значения. Основной проблемой была ошибочная обработка булевых значений false вспомогательным методом. Это привело к постоянной неправильной идентификации флага dry_run. Исходное предположение дизайна о типах параметров, по-видимому, стало первопричиной.