puts добавляет новую строку, писать не делает. Технически, puts добавляет разделитель записей (который обычно является символом новой строки) к выходу, если он не имеет одного в конце. записывает выходы только то, что дано.
Ответ 2
В таких случаях я всегда начинаю с документации Ruby Core, в этом случае класс IO.
ios.puts(obj, ...) => nil
Записывает данные объекты в ios, как с помощью IO#print. Записывает разделитель записей (как правило, новую строку) после тех, которые еще не заканчиваются последовательностью новой строки. Если вызывается с аргументом массива, записывает каждый элемент в новую строку. Если вызывается без аргументов, выводится один разделитель записи.
ios.write(string) => integer
Записывает данную строку в ios. Поток должен быть открыт для записи. Если аргумент не является строкой, он будет преобразован в строку с помощью to_s. Возвращает количество записанных байтов.