電話番号を単に数字とハイフンの並びと見るだけであればまだいいのですが、真面目に扱おうとすると割と面倒です。

幸い、Googleのlibphonenumberやそれをバリデーション用にラップしたtelephone_numberというgemがあるので、それらを活用すると簡単に扱えるはずです。

mobi/telephone_number
Phone number validation for Ruby. Contribute to mobi/telephone_number development by creating an account on GitHub.

電話番号のバリデーションをそのうち実装することになりそうなので、使い方を調べてみました。

Rails Validation

ざっくり書くとこんな感じ。

validates :phone, telephone_number: {country: :ja, types: [:fixed_line, :mobile]}

コードを見る限りではcountryの指定は必須、typesは指定しない場合は全タイプで判定するようですね。

https://github.com/mobi/telephone_number/blob/master/lib/active_model/telephone_number_validator.rb

マニュアルでの呼び出しの場合、countryは必須ではありません。

phone = TelephoneNumber::Number.new(number) # country => nil
phone.valid?

その場合、validation時にどこの国の番号かを推測するために、国番号が先頭になるかどうかなどのマッチングを行います。きちんと判定するには国はアプリケーション側で渡すのが良さそうです。

このライブラリを使ったRailsのデモサイトもあります。

バリデーション結果やいろんな表記に変換した結果なんかを見ることができます。