質問

のクイック背景:私は他のページへの参照を含む文字列を持っています。 「#12」:ページはフォーマットを使用してにリンクされています。ページのIDが続いたハッシュ。

私は次の文字列があるとします:

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

私はすでにリンク必要とするページのIDを知っています:

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

どうすればループページIDを通って、それぞれのページに#12と#125をリンクしますか?私は(レールに)次のことを行う場合、私はに実行した問題があります:

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

この#12のために正常に動作しますが、それは12のIDとページに#125の「12」の部分をリンクします。

すべてのヘルプは素晴らしいだろう。

役に立ちましたか?

解決

あなたのインデックスは常にワード境界で終了した場合、あなたはそれを一致させることができます:

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

あなただけの検索パターンにワード境界シンボル\bを追加する必要があり、それは置換パターンのために必要ではありません。

他のヒント

代わりに、最初のIDを抽出し、それらを置き換えるのでは

、あなたは、単に一度にそれらを見つけると置き換えることができます:

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

あなたにもどこかのIDを必要とするので、あなたが抽出工程を省略することができない場合であっても、それは各idの文字列全体を通過する必要がないので、これは、はるかに高速である必要があります。

PS:strが他のどこからも参照されていない場合は、代わりにstr.gsub!str = str.gsubを使用することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top