2016-02-16 1 views
1

Здравствуйте, я включил следующие драгоценный камень в моей GemfileGeocoder камень создает вопрос в Heroku сервера

камень 'геокодер'

и написано следующий код в моем файле представления

- @location = Geocoder.search(request.remote_ip).first.country 
%div{"class" => "currentCountry", "value" => "#{@location}"} 
- if session[:browser] == 'mobile' 
    testmobile 
- else 
    testdesktop 

и в сервере heroku он дает мне ошибку, пока на моем локальном сервере работает нормально.

ActionView::Template::Error (undefined method `country' for nil:NilClass): 
2016-02-16T07:47:14.447459+00:00 app[web.1]: 
2016-02-16T07:47:14.447455+00:00 app[web.1]:  3: - if session[:browser] == 'mobile' 
2016-02-16T07:47:14.447456+00:00 app[web.1]:  4: = render 'mobile' 
2016-02-16T07:47:14.447457+00:00 app[web.1]: app/views/spree/checkout/edit.html.haml:1:in `_b6865a451d7a5a040f6c1f6376727300' 
2016-02-16T07:47:14.447458+00:00 app[web.1]: 
2016-02-16T07:47:14.447454+00:00 app[web.1]:  1: - @location = Geocoder.search(request.remote_ip).first.country 
2016-02-16T07:47:14.447454+00:00 app[web.1]:  2: %div{"class" => "currentCountry", "value" => "#{@location}"} 

Пожалуйста, объясните, почему я столкнулся с этой ошибкой на сервере heroku.

ответ

1

Я прошел через это раньше, потому что запрос истекает, и ответ равен нулю. Причины: -

  • : ip_lookup (default- freegeoip)
  • : Тайм-аут (default- 3 секунды)

Freegeoip в качестве своей бесплатный сервис, как правило, перегружены, а иногда может реагировать поздно, и по истечении времени ожидания по умолчанию задано как 3 секунды запрос получает тайм-аут и возвращает nil в качестве ответа, который вызывает эту проблему (то же самое обсуждалось here).

Solutions: -.

  • переключатель на несколько платных IP службу поиска (другие варианты here), чтобы получить лучшее и более быстрое обслуживание (рекомендуется)
  • продолжать freegeoip но увеличить время ожидания до 7-8 секунд так что запрос не получит timedout в ближайшее время (не рекомендуется для производственных приложений)

Обе опции ip_lookup и тайм-аут может быть настроен в инициализаторе (проверьте here для получения дополнительной информации, спасибо ,

1
geocoder_result = Geocoder.search(request.remote_ip) 

@location = geocoder_result.empty? ? "" : geocoder_result.first.country