Вопрос

Краткая предыстория:У меня есть строка, содержащая ссылки на другие страницы.Страницы связаны с использованием формата:«#12».Хэш, за которым следует идентификатор страницы.

Скажем, у меня есть следующая строка:

str = 'This string links to the pages #12 and #125'

Я уже знаю идентификаторы страниц, на которые нужно связать:

page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]

Как я могу просмотреть идентификаторы страниц и связать № 12 и № 125 с соответствующими страницами?Проблема, с которой я столкнулся, заключается в том, что я делаю следующее (в рельсах):

page_ids.each do |id|
  str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end

Это отлично работает для № 12, но привязывает часть «12» № 125 к странице с идентификатором 12.

Любая помощь была бы потрясающей.

Это было полезно?

Решение

если ваши индексы всегда заканчиваются на границах слов, вы можете сопоставить это:

page_ids.each do |id|
  str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end

вам нужно только добавить символ границы слова \b по шаблону поиска он не нужен для шаблона замены.

Другие советы

Вместо того, чтобы сначала извлекать идентификаторы, а затем заменять их, вы можете просто найти и заменить их за один раз:

str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }

Даже если вы не можете пропустить этап извлечения, потому что вам нужны идентификаторы где-то еще, это должно быть намного быстрее, поскольку не нужно проходить через всю строку для каждого идентификатора.

ПС:Если str нигде больше не упоминается, вы можете использовать str.gsub! вместо str = str.gsub

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top