RailsでデータをDBに入れる際に、電話番号のフォーマットをとりあえずなんでもOKにしていたら、半角や全角や括弧やハイフンやスペースが入り混じったデータ群になってきたので、あんまり見た目がよくないので整形するrake taskを作って、整形後に、どうせなら検証条件も作ってしまおうと思って作った次第。
その後、他のデータの更新を行ったところ…。
失敗するじゃありませんか!しかも電話番号のフォーマットが不正だと言われる始末!
user = User.find 1 # 失敗したレコードのIDを指定 user.tel # => "00-0000-0000" user.valid? # => false user.tel = "00-0000-0000" user.valid? # => true
はぁ???
理解できない…。
他にもあるかと思い、とりあえず抽出する。
invalid_users = [] User.find_each do |user| invalid_users << user unless user.valid? end invalid_users.count # => 1
どうも1件だけだった模様。
pry(main)>invalid_users.first => #<User:0x007fd8fb7188e8 id: 1, tel: "0<U+200B>0<U+200B>-<U+200B>0<U+200B>0<U+200B>0<U+200B>0<U+200B>-<U+200B>0<U+200B>0<U+200B>0<U+200B>0" >
ファッ!?なんだ、この<U+200B>って!!
ググったら、Yahoo!知恵袋がヒットした。どうも幅なしスペースというものらしい。幅がないので、見た目にはわからないわけです。単に、user.telだと文字列が表示されるだけだったので、見えなかったのです。
削除する方法は、正規表現でヒットさせるしかないんだろうなぁと思って調べていたら、qiitaにありました。(PHPの記事だったけど、やることは同じ)
とりあえず幅なしスペースを削除して更新したかったので、以下を流すrake taskを作って終わり。
User.find_each do |user| user.tel = user.tel.gsub(/[\xe2\x80\x8b]+/, '') user.save! end