Rails: ошибка в действии "Timeout::Error в CarsController#show"

Когда я загружаю свое действие CarsController#show в браузере я получаю это сообщение об ошибке:

Timeout::Error in CarsController#show

execution expired

И ошибка, указывающая на эту строку:

country = GeoIp.geolocation(ip, :precision => :country)

Вся акция:

def show
    @car = Item.find_by_car_key(params[:car_key])

    ip = request.remote_ip
    geo_key = 'my geo key'
    GeoIp.api_key = geo_key
    country = GeoIp.geolocation(ip, :precision => :country)
    puts country.inspect

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @item }
    end
  end

Как я могу избежать этого сообщения об ошибке и использовать его всегда, когда это действие будет загружено?

Спасибо

2 ответа

Предполагая, что вы используете GeoIP Gem, найденный здесь

Ошибка связана с тайм-аутом, возможно, geoip gem отнимает много времени для получения информации ip, поэтому после того, как ваш ключ API установил тайм-аут GeoIp

Согласно ознакомительному письму,

Можно установить таймаут для всех запросов. По умолчанию это одна секунда, но вы можете легко установить другое значение. Так же, как вы установили бы api_key, вы можете установить время ожидания:

Пытаться

 GeoIp.timeout = 5 # In order to set it to five seconds

Обновить

Я порекомендую вам другой драгоценный камень, потому что geoip не обновлен, посмотрите Geocoder https://github.com/alexreisner/geocoder, он может автоматически взять IP-адрес из запроса, как

request.location.country
request.location.city 

Я бы порекомендовал использовать geocoder gem в сочетании с maxmind или freegeoip, который хорошо работает в моем производственном приложении (freegeoip иногда обнаруживает не ту страну, но она бесплатна)

Другие вопросы по тегам