-1

当我在浏览器中加载我的操作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

如何避免此错误消息并在加载此操作时始终使用它?

谢谢

4

2 回答 2

1

假设您使用的是此处找到的 GeoIP gem

该错误与超时有关,也许 geoip gem 需要很长时间才能获取 ip 信息,所以在您的 Api Key 设置 GeoIp 超时之后

根据 gem 自述文件,

可以为所有请求设置超时。默认为一秒,但您可以轻松设置不同的值。就像您设置 api_key 一样,您可以设置超时:

尝试

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

更新

我会推荐你​​另一个gem,因为geoip也不是最新的,看看Geocoder https://github.com/alexreisner/geocoder,它可以自动从请求中获取IP地址,比如

request.location.country
request.location.city 
于 2013-09-09T17:32:26.580 回答
0

我建议将geocoder gem 与 maxmind 或 freegeoip 结合使用在我的生产应用程序中效果很好(freegeoip 有时会检测到错误的国家,但它是免费的)

于 2013-09-09T17:46:01.130 回答