-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 キーが GeoIp タイムアウトを設定した後に

gem の readme によると、

すべてのリクエストにタイムアウトを設定できます。デフォルトでは1 秒ですが、別の値を簡単に設定できます。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 
于 2013-09-09T17:32:26.580 に答える
0

geocoder gem を maxmind または freegeoip と組み合わせて使用​​することをお勧めします (freegeoip は間違った国を検出することがありますが、無料です)。

于 2013-09-09T17:46:01.130 に答える