Pregunta

fondo rápida: Tengo una cadena que contiene referencias a otras páginas. Las páginas están vinculadas al uso del formato: "# 12". Un hash seguido del ID de la página.

Decir que tengo la siguiente cadena:

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

Ya sé los ID de las páginas que necesitan que unen:

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

¿Cómo puedo recorrer los ID de página y enlazar el # 12 y # 125 a sus respectivas páginas? El problema que he encontrado es que si hago lo siguiente (en rieles):

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

Esto funciona bien para # 12, pero que se vincula la parte "12" de # 125 a la página con los ID de 12.

Cualquier ayuda sería impresionante.

¿Fue útil?

Solución

Si sus índices siempre terminan en los límites de palabra, que puede coincidir con lo siguiente:

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

sólo tiene que añadir el límite de palabra símbolo \b en el patrón de búsqueda, no es necesario que el patrón de sustitución.

Otros consejos

En lugar de extraer los identificadores primero y luego reemplazarlos, sólo tiene que buscar y reemplazar ellos de una sola vez:

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

Incluso si no se puede dejar de lado la etapa de extracción, ya que necesita los identificadores en otro lugar, así, esto debería ser mucho más rápido, ya que no tiene que ir a través de toda la cadena para cada ID.

PD: Si str no se conoce de ninguna otra parte, se puede utilizar en lugar de str.gsub! str = str.gsub

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top