9

簡単な背景:他のページへの参照を含む文字列があります。ページは「#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で正常に機能しますが、#125の「12」の部分をIDが12のページにリンクします。

どんな助けでも素晴らしいでしょう。

4

2 に答える 2

22

最初にIDを抽出してから置き換える代わりに、一度にIDを見つけて置き換えることができます。

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

他の場所にもIDが必要なために抽出手順を省略できない場合でも、各IDの文字列全体を調べる必要がないため、これははるかに高速です。

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

于 2009-08-17T13:07:37.703 に答える
14

インデックスが常に単語の境界で終わる場合は、次のように一致させることができます。

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

検索パターンに単語境界記号を追加するだけ\bでよく、置換パターンには必要ありません。

于 2009-08-17T12:41:28.930 に答える