Обрезать строку без разреза в середине слова в рельсах - PullRequest
21 голосов
/ 03 января 2012

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

Ответы [ 3 ]

45 голосов
/ 03 января 2012

Если вы передадите разделитель методу усечения, он выполнит естественный разрыв слова вместо усечения в середине слова

Примерно так должно работать (измените длину на то, что вы хотите удалитьэто вообще, если вы хотите по умолчанию 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 => ' ')

Более подробную информацию о параметрах, которые вы можете иметь в усеченном, можно найти в Документация

6 голосов
/ 26 января 2016

Начиная с 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)"
6 голосов
/ 27 января 2014

Truncate - отличный вариант, но если вы хотите, чтобы полное определение слова , regex - ваше решение.Я бы порекомендовал что-то вроде этого:

string.match(/^.{0,30}\b/)[0]

Или вы можете поместить это в функцию

def shorten(string, count)
  string.match(/^.{0,#{count}}\b/)[0]
end

Обновление

Согласно Документация по Rails Вы можете передать регулярное выражение в метод усечения, например, так:

'Once upon a time in a world far far away'.truncate(27, separator: /\s/)

Обе эти опции предлагают намного лучшее обнаружение границы слова, чем передача символа пробела в метод усечения.

...