railsの練習にTwitterのクローンアプリを作ってたときの話。結構ハマったので自分用にメモ。
問題発生
ツイートのリプライになってる部分をリンクに置換する簡単なヘルパーメソッドを定義しました。
application_helper.rb
def ids_to_link(text)
text.gsub(/@([a-z0-9_]{1,15})\b/) do |word|
link_to word, user_path($1)
end
end
覚えたてのRubyでこんなコードを書きました。正規表現の該当部分をlink_to
で置換するだけの簡単なコード。私は意気揚々とブラウザのリロードボタンを押しました。しかし、、、
動かない・・・ッ!!!
gsub
の使い方は正しいはずなのになぜか$1
が空っぽで困り果てました。
原因
このメソッドを適用する直前でh()
を呼んでいたので、文字列がString
ではなくSafeBuffer
になっていたことが原因でした。どうやらString
とSafeBuffer
ではgsub
の挙動が違うようです。
私はこの時SafeBuffer
というものの存在を初めて知りました。erbでエスケープするものとしないものを区別するためにあるようです。
解決
gsub
を呼ぶ前にto_str
を呼ぶとちゃんと動きました。
application_helper.rb
def ids_to_link(text)
text.to_str.gsub(/@([a-z0-9_]{1,15})\b/) do |word|
link_to word, user_path($1)
end
end
ちなみにこの時、to_s
だとダメでした。何が違うんだろ、、、
まとめ
なんでgsub
だけString
と仕様違うんですかね。