使用ruby和sinatra以及Phony gem如何从电话号码中找到alpha2代码?

时间:2015-05-07 02:56:42

标签: ruby sinatra plivo

我有一个国际号码作为字符串,所以81312345678(日本,东京号码)或85212345678(香港)我需要隔离国家代码,在日本的情况下为81,在香港的情况下为852,然后识别该国家的2个字母的alpha2代码。

我已经尝试了如下虚假宝石:

number = Phony.format('18091231234', :format => :international)
  puts number
  split = Phony.split('85212345678')
  puts split[0]

就香港而言,我现在想采取' 852'并获得香港的2个字母的国家代码,然后使用Plivo api查询价格。

产生:

+1 809 123 1234
852

我已经尝试了'iso_country_codes'宝石未成功和“国家”#39;宝石:

c = Country.find_country_by_national_prefix('852')
  puts c.alpha2

错误消息为'undefined method alpha2'这应该很容易。有什么想法吗?一如既往地谢谢。

2 个答案:

答案 0 :(得分:0)

通过一些测试,看起来香港的national_prefix值(countries宝石)"None"。您可能希望使用Country#find_country_by_country_code,如此:Country.find_country_by_country_code('852')这将返回香港,然后您可以拨打#alpha2

在旁注中,您可能需要先检查c是否nil,然后再尝试拨打alpha2

答案 1 :(得分:-1)

虽然“虚假”宝石仍然非常有用,但我尝试使用“countries”宝石和“iso_country_codes”宝石,但很难取得部分成功,所以我最终从Plivo网站下载了定价数据(超过38,000个)行)并将其加载到postgres数据库。

一列是country_code,另一列是前缀列。在某些情况下,您只需要country_code和其他country_code和前缀来获得精确的结果。所以,这是代码:

get '/iso' do
    number = '447928xxxxxx' #this is a mobile so you need both 44 and 7928
    code = Phony.split(number)
    lookup = code.take(2).join #joins the first 2 elements of the array
    result = DB[:call_pricing].where(:prefix=>lookup).get(:rate_usd)
    if result.nil?
      lookup = code.take(1) 
    result = DB[:call_pricing].where(:prefix=>lookup).get(:rate_usd)
    end
end

我希望这有助于其他人。