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 иногда обнаруживает не ту страну, но она бесплатна)