Подтвердить что ты не робот

Усечь строку без разреза в середине слова в рельсах

Как я могу усечь текст в ближайшую позицию с помощью рельсов 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..."
4b9b3361

Ответ 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)"