Medium

 昨日はユルさんと一緒に初詣に行きました。赤坂にある日枝神社です。写真にあるように、まわりを高層ビルに囲まれている都心の神社ですが、ちゃんと神社が備えているべき雰囲気を持っていて落ち着けます。少なくとも明治神宮よりは全然いいですね。ひさしぶりにたき火にあたりました。

 DBになぜか変な文字列が混入してしまうという現象に出会ってしまって、ちょっとハマってしまいました。Youtube動画の情報をDBに保持する処理のところです。

    text.scan(/\[youtube:(.+?)\]/).each do |number|
    ……
    (省略)
    ……
    item = Youtube.new(:youtube_number => number, :image_url_small => image_url)

 たとえば、「wwLrgxtALWs」という動画IDがnumberに入っているとします。このあとにsaveをかますと、なぜかDB上のyoutube_numberカラムは

    ---\n - wwLrgxtALWs

 というような状態になっているのです。動画IDの前に入っているなぞの文字列はなんなんだよう。しばらく悩んだ末に、numberのクラスがStringでないことに気づきました。調べてみると、numberのクラスはArrayだったのです。というわけで、

item = Youtube.new(:youtube_number => number.to_s, :image_url_small => image_url)

 これで解決しました。

 ちょっと納得いかなかったので、scanメソッドについてちょっと調べてみます。

a = "1111abc222def333ghi444"
 
a.scan(/abc(.+?)def/) do |text1|
  p text1.class
end

 結果は

Array

 ところが以下のようにすると、

a = "1111abc222def333ghi444"
 
a.scan(/abc(.+?)def(.+?)ghi/) do |text1, text2|
  p text1.class
  p text2.class
end

 結果は

String
String

 うおー、納得いかねー。確かに オンラインマニュアルを見ると、カッコでくくった部分文字列の配列を返すと書いてある。ちゃんと読んでなかったぼくが確かに悪かったよ。でも、ブロックに渡すパラメータが2個になるとStringになっちゃうのはなんでなんだろう。