Это прекрасно объясняется здесь :
Прежде всего, ни to_i, ни to_int не предназначены для того, чтобы делать что-то более необычное, чем другие. Как правило, эти два метода не сильно отличаются друг от друга по своей реализации, они отличаются только тем, что объявляют внешнему миру. Метод to_int обычно используется с условными выражениями и должен пониматься следующим образом: «Может ли этот объект всегда рассматриваться как вещественное целое число?»
Метод to_i обычно используется для фактического преобразования, и его следует понимать так: «Дайте мне наиболее точное целочисленное представление этого объекта, пожалуйста»
Например, String - это класс, который реализует to_i, но не реализует to_int. Это имеет смысл, потому что строка сама по себе не может рассматриваться как целое число. Однако в некоторых случаях он может иметь представление в целочисленной форме. Если мы напишем x = «123», мы вполне можем сделать x.to_i и продолжить работу с полученным экземпляром Fixnum. Но это сработало только потому, что символы в x можно было перевести в числовое значение. Что если бы мы написали: x = «лошадь снаружи смешная»? Правильно, строку просто нельзя постоянно считать целым числом.