Воспроизведите проблему на небольшом примере, проверьте промежуточные значения через p/inspect и изучите стек исключения. Для приложения используйте Logger с уровнями и безопасным контекстом. Локальная переменная с логгером вне def не видна внутри метода: передавайте его аргументом или используйте предусмотренный объект логирования. Не скрывайте ошибку безусловным rescue и не пишите секреты в логи.
Как отладить Ruby-код без дебаггера?
Минимальный воспроизводимый пример, диагностический вывод, Logger и стек ошибки без утечки данных и сокрытия исключений.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Без пошагового дебаггера полезно сузить проблемный участок и проверить гипотезу о данных. Сначала получите повторяемый вход, ожидаемый результат и фактическую ошибку. Затем ставьте диагностический вывод на границах этапов, а не печатайте всё приложение.
puts подходит для сообщений, а p object использует inspect и помогает увидеть, например, отличие строки от числа. Для больших коллекций выводите размер и небольшой обезличенный пример. Пароли, токены, содержимое резюме и другие персональные данные в такой вывод попадать не должны.
В приложении удобнее Logger:
require "logger"
logger = Logger.new($stdout)
logger.level = Logger::DEBUG
def process_data(data, logger:)
logger.debug { "process_data input_type=#{data.class}" }
result = data.upcase
logger.debug { "process_data output_length=#{result.length}" }
result
rescue StandardError => error
logger.error { "process_data failed error_type=#{error.class}" }
raise
end
process_data("sample", logger: logger)
Логгер передан явно: локальная переменная, созданная снаружи, не захватывается обычным определением def. Повторный raise сохраняет ошибку для вышестоящего обработчика, вместо того чтобы незаметно вернуть nil. Документация Logger.
Стек исключения показывает путь вызовов и место сбоя; проверяйте также первый участок своего кода, а не только строку библиотеки. После локализации закрепите найденный случай небольшой проверкой. Временный подробный вывод уберите или оставьте на управляемом уровне: избыточное логирование способно само изменить тайминги и нагрузку.