2015-07-07 2 views
3

Я должен добавить time_zone_select в мое приложение Rails. Я рассматривал некоторые драгоценные камни, чтобы поместить значение по умолчанию на основе пользовательского запроса, но я видел, что проект уже установил для этой цели geocode gem.Как получить часовую зону с камнем геокода?

Есть ли способ получить часовой пояс через этот драгоценный камень?

ответ

6

Вы не можете получить часовой пояс непосредственно из драгоценного камня геокодера. Он может просто дать вам местоположение.

Вы можете использовать драгоценный камень внизу, чтобы получить часовой пояс для определенной зоны или для (lat, long) значений.

https://github.com/panthomakos/timezone

timezone = Timezone::Zone.new :latlon => [-34.92771808058, 138.477041423321] 
timezone.zone 
=> "Australia/Adelaide" 
timezone.time Time.now 
=> 2011-02-12 12:02:13 UTC 
+0

Я пробовал эти две минуты назад, но я получаю эту ошибку: Часовой пояс :: Ошибка :: InvalidConfig: отсутствует имя пользователя https://github.com/panthomakos/timezone/issues/34 –

+0

Добавили ли вы свой api-ключ? как показано ниже ? Часовой пояс :: Configure.begin do | c | c.google_api_key = 'your_google_api_key_goes_here' c.google_client_id = 'your_google_client_id' end –

+0

Вы должны получить ключ api из Google и настроить его. –

0

Я видел альтернативный способ сделать это, но предложение Нитин Сатиш еще лучше. Во всяком случае, это хорошо, чтобы иметь более чем один вариант:

loc = request.location.data 
tzc = TZInfo::Country.get(loc["country_code"]) 
timezone = Timezone::Zone.new zone:tzc.zone_names.first 
timezone.local_to_utc(Time.now) 
+3

Как записка, вы смотрите по стране и принимаете первый часовой пояс в этой стране. Это не обязательно будет иметь место, например. США. –

+0

Совершенно верно. Спасибо за этот вопрос. Он работает только для стран с одним часовым поясом –

1

Это, кажется, делает трюк для меня (для большинства часовых поясов я проверил).

Весь код, который я поставил здесь, это методы в контроллере (в моем случае, в ApplicationController).

def request_location 
    if Rails.env.test? || Rails.env.development? 
    Geocoder.search("your.public.ip.here").first 
    else 
    request.location 
    end 
end 

def get_time_zone 
    time_zone = request_location.data["time_zone"] 
    return ActiveSupport::TimeZone::MAPPING.key(time_zone) || "UTC" 
end 

Конечно, вы должны заменить your.public.ip.here для фактического общественного IP, или что-то подобное. Я помещаю здесь IP, чтобы ответ, который дает Geocoder, имеет тот же формат, что и запрос.

Я рад услышать комментарии к коду.

Смежные вопросы