ruby-on-railscountry-codescountries

Rails: Phone numbers - international prefix


I am using countries gem and country-select gem.

I have an attribute in my phones table called :country_code. I ask users in the new phone form to pick their country:

<%= f.input :country_code,  label: false, wrapper: :vertical_input_group  do %>
  <span class="input-group-addon">Country</span>
  <%= country_select("phone", "country_code", {priority_countries["AU", "GB", "NZ"], selected: "AU" }, class: "form-control" ) %>
<% end %>

I want to take that country and get the international prefix.

I have a phones model, which I have:

def landline_number
   [international_code, area_code, phone_number].join('   ')
end

def international_code
   self.country_code = ISO3166::Country[country_code]
   country_code.translations[I18n.locale.to_s] || country_code.international_prefix
end

When I try:

<%= @phone.landline_number %>

It prints the country name instead of the international prefix.

How do I get it to print a number instead of country name?


Solution

  • It seems to me that your problem is this line:

    country_code.translations[I18n.locale.to_s] || country_code.international_prefix
    

    according to the documentation examples

    # Get a specific translation
    c.translation('de') #=> 'Vereinigte Staaten von Amerika'
    c.translations['fr'] #=> "États-Unis"
    
    ISO3166::Country.translations             # {"DE"=>"Germany",...}
    ISO3166::Country.translations('DE')       # {"DE"=>"Deutschland",...}
    

    you are actually extracting the country's name first and since it's found the code

    country_code.international_prefix
    

    is not executed due to the || condition you have. If you would remove the code to the left of the || it should work. In other words try leaving your method like this:

    def international_code
        self.country_code = ISO3166::Country[country_code]
        country_code.international_prefix
    end