Pergunta

Fundo rápido: Eu tenho uma string que contém referências a outras páginas. As páginas estão ligadas ao uso do formato: "# 12". Um hash seguido do ID da página.

Say Eu tenho a seguinte string:

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

Eu já sei os IDs das páginas que precisam de ligação:

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

Como posso percorrer os ids página e vincular o # 12 e # 125 para suas respectivas páginas? O problema que eu tenho que correr para é se eu faço o seguinte (em rails):

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

Esta multa trabalha para # 12, mas que liga a parte "12" de # 125 para a página com ID de 12.

Qualquer ajuda seria fantástico.

Foi útil?

Solução

Se seus índices sempre terminar em limites de palavra, você pode combinar que:

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

você só precisa adicionar o limite de palavra símbolo \b no padrão de pesquisa, não é necessário para o padrão de substituição.

Outras dicas

Em vez de extrair os ids em primeiro lugar e, em seguida, substituí-los, você pode simplesmente encontrar e substituí-los de uma só vez:

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

Mesmo que você não pode deixar de fora a etapa de extração, porque você precisa os ids em outro lugar, bem, isso deve ser muito mais rápido, uma vez que não tem que passar por toda a cadeia para cada id.

PS: Se str não é referido em qualquer outro lugar, você pode usar str.gsub! vez de str = str.gsub

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top