Frage

Schnell Hintergrund: Ich habe eine Zeichenfolge, die Verweise auf andere Seiten enthält. Die Seiten werden mit dem Format verknüpft: „# 12“. Ein Hash, gefolgt von der ID der Seite.

Sagen, ich habe die folgende Zeichenfolge:

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

Ich weiß schon, die IDs der Seiten, die brauchen Verknüpfung:

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

Wie kann ich eine Schleife durch den Seite-IDs und verknüpft die # 12 und # 125 zu ihren jeweiligen Seiten? Das Problem, das ich habe laufen in ist, wenn ich die folgende (in Schienen) zu tun:

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

Dies funktioniert gut für # 12, aber es verbindet den „12“ Teil # 125 auf der Seite mit der ID von 12.

Jede Hilfe wäre genial.

War es hilfreich?

Lösung

Wenn Ihre Indizes immer an Wortgrenzen beenden, können Sie das Spiel:

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

Sie nur das Wort Grenze Symbol \b auf dem Suchmuster hinzufügen müssen, ist es nicht erforderlich, dass die Ersetzungsmuster.

Andere Tipps

Statt die IDs zuerst zu extrahieren und ersetzt sie dann, können Sie einfach finden und ersetzen Sie sie in einem Rutsch:

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

Auch wenn Sie den Extraktionsschritt nicht auslassen können, weil Sie die IDs woanders als auch benötigen, soll dies viel schneller sein, da es nicht für jede ID durch die gesamte Zeichenfolge gehen hat.

PS: Wenn str nicht von irgendwo anders bezeichnet wird, Sie str.gsub! statt str = str.gsub verwenden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top