おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

人生の三大苦痛のひとつは、武勇伝を聞かされることである

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になっちゃうのはなんでなんだろう。