Усечь строку без разреза в середине слова в рельсах
Как я могу усечь текст в ближайшую позицию с помощью рельсов 3, не срезая посередине слова?
Например, у меня есть строка:
"Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum."
Если я вырезаю его, я хочу сделать так:
"Praesent commodo cursus magna, vel scelerisque nisl ..."
И не:
"Praesent commodo cursus magna, vel scelerisque nisl conse..."
Ответы
Ответ 1
Если вы передадите разделитель методу truncate, он выполнит естественный разрыв слова вместо усечения в середине слова
Что-то вроде этого должно работать (измените длину на все, что вы хотите удалить, если хотите, чтобы по умолчанию было 30 символов):
truncate("Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum.", :length => 17, :separator => ' ')
Более подробную информацию о параметрах, которые вы можете иметь в truncate, можно найти в Документация
Ответ 2
Truncate - отличный вариант, но если вы хотите иметь полное распознавание слов, регулярное выражение - ваше решение. Я бы рекомендовал что-то вроде этого:
string.match(/^.{0,30}\b/)[0]
Или вы можете поместить это в функцию
def shorten(string, count)
string.match(/^.{0,#{count}}\b/)[0]
end
Update
Согласно Rails documentation, вы можете передать регулярное выражение в метод truncate, например:
'Once upon a time in a world far far away'.truncate(27, separator: /\s/)
Обе эти опции обеспечивают гораздо лучшее обнаружение границ слов, чем передача символа пробела в метод truncate.
Ответ 3
Запуск Rails 4.2
существует новый метод ActiveSupport
, называемый string#truncate_words
. Он обрезает строку по количеству слов, что делает невозможным срез посередине слова.
'And they found that many people were sleeping better.'.truncate_words(5, omission: '... (continued)')
который возвращает
"And they found that many... (continued)"