9


6

_背景が速い:他のページへの参照を含む文字列があります。 ページは "#12"という形式でリンクされています。 ハッシュとそれに続くページのID。

次のような文字列があるとします。

'str ='この文字列はページ#12と#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のページにリンクさせます。

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

2 回答


22


最初にIDを抽出してから置き換えるのではなく、一度にそれらを見つけて置き換えることができます。

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

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

PS:他の場所から str`が参照されていなければ、 str = str.gsub`の代わりに `str.gsub!`を使うことができます。


13


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

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

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