LoginSignup
5
2

More than 5 years have passed since last update.

Railsのgsubでハマった話

Last updated at Posted at 2015-10-04

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で置換するだけの簡単なコード。私は意気揚々とブラウザのリロードボタンを押しました。しかし、、、

スクリーンショット 2015-09-27 14.59.23.png

動かない・・・ッ!!!

gsubの使い方は正しいはずなのになぜか$1が空っぽで困り果てました。

原因

このメソッドを適用する直前でh()を呼んでいたので、文字列がStringではなくSafeBufferになっていたことが原因でした。どうやらStringSafeBufferでは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と仕様違うんですかね。

5
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2