Я удивлен, что ни один из ответов не является действительно правильным (или ограничен использованием rails helper), хотя это очень старый вопрос, поэтому здесь есть решение.
Позволяет четко сформулировать, что является целью в первую очередь. Мы хотим обрезать строку s
до 30 символов и также вырезать последнее слово, если оно не может полностью уместиться. Мы также хотим обрезать конечные пробелы в результате и добавить многоточие, если текст был сокращен.
Если текст длиннее, чем ограничение, то сокращение будет таким же простым, как
s[0,s.rindex(/\s/,30)].rstrip + '...'
Если мы хотим, чтобы весь результат был максимум 30 символов, то это так же просто, как вычитание длины эллипса из 30. Так как мы используем три точки (а не один трехточечный символ), нам нужно
s[0,s.rindex(/\s/,27)].rstrip + '...'
И окончательный результат (с проверкой, нужно ли нам вообще урезать):
if s.length<=30
s
else
s[0,s.rindex(/\s/,27)].rstrip + '...'
end
Вот так.
Примечание. Существуют некоторые тенистые случаи, когда желаемый результат неочевиден. Вот они:
- Если строка заканчивается множеством пробелов (
s= "Helo word "
), но короче, чем 30. Следует ли сохранять пробелы? - В настоящее время они.
- То же, что и выше, но пробелы в конце пересекают предел o 30. Как и в (
s= "Twentyseven chars long text "
) - в настоящее время все пробелы до конца обрезаны и добавлены многоточие.