Domanda

sfondo rapida: Ho una stringa che contiene riferimenti ad altre pagine. Le pagine sono collegate al utilizzando il formato: "# 12". Un hash seguito dal ID della pagina.

Dire che ho la seguente stringa:

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

So già gli ID delle pagine che necessitano di collegamento:

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

Come faccio a ciclo attraverso gli ID di pagina e collegare il # 12 e # 125 alle rispettive pagine? Il problema che ho incontrato è che se faccio la seguente (in rotaie):

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

Questo funziona bene per la # 12, ma si collega la parte "12" di # 125 alla pagina con ID di 12.

Qualsiasi aiuto sarebbe impressionante.

È stato utile?

Soluzione

se gli indici terminano sempre ai confini di parola, è possibile abbinare che:

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

è sufficiente aggiungere il simbolo confine di parola \b sul modello di ricerca, non è necessario per il modello di sostituzione.

Altri suggerimenti

Invece di estrarre gli ID e poi la loro sostituzione, si possono trovare in modo semplice e sostituirli in un colpo solo:

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

Anche se non si può tralasciare la fase di estrazione perché è necessario gli ID da qualche altra parte, così, questo dovrebbe essere molto più veloce, dal momento che non ha bisogno di passare attraverso l'intera stringa per ogni ID.

PS: Se str non è contemplata da qualsiasi altro luogo, è possibile utilizzare al posto di str.gsub! str = str.gsub

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top