Основная проблема с вашим кодом состоит в том, что String#to_i
метод всеяден.
"0".to_i #⇒ 0
"0.1".to_i #⇒ 0
"foo".to_i #⇒ 0
Тем не менее, user_input
в вашем коде всегда целое .
То, что вы, вероятно, хотите, это принимать только цифры (и, возможно, ведущий минус для негативов.) Единственный краткий способ принять подмножество символов - это регулярное выражение.
# chomp to strip out trailing carriage return
user_input = gets.chomp
if user_input =~ /\A-?\d+\z/
...
Регулярное выражение выше ничего не значитза исключением цифр с необязательным начальным минусом.
Или, что еще лучше (кредиты @Stefan)
if gets =~ /\A-?\d+\Z/