Rails:操作错误“CarsController#show 中的 Timeout::Error”
Posted
技术标签:
【中文标题】Rails:操作错误“CarsController#show 中的 Timeout::Error”【英文标题】:Rails: Error in action "Timeout::Error in CarsController#show" 【发布时间】:2013-09-09 17:01:07 【问题描述】:当我在浏览器中加载我的操作 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
如何避免此错误消息并在加载此操作时始终使用它?
谢谢
【问题讨论】:
GeoIp.geolocation
是做什么的?也许它正在运行一个很长的过程导致您的请求超时?
GeoIp.geolocation(ip, :precision => :country)
只是找出浏览该网站的用户的当前位置。 “也许它正在运行一个很长的过程导致您的请求超时?” -> 不,因为我在输入 URL 1 秒后看到错误。该 gem 名为 geo_ip。
Ruby 调试器可以帮助解决此类问题。放入调试语句并逐行检查以查看失败的原因和原因。 github.com/cldwalker/debugger
如果您提出问题,请花时间给我们反馈,您有几个问题,请查看
【参考方案1】:
假设您使用的是 here 找到的 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
【讨论】:
可能会提供一些关于默认超时时间的文档。如果它与 OP 正在经历的时间相同,这可能非常有价值 这取决于你使用的是哪个 gem,你能告诉我吗?因为在github.com/jeroenj/geo_ip#timeout 默认是1秒 我建议在初始化程序中设置客户端,而不是每个请求。【参考方案2】:我建议将geocoder gem 与 maxmind 或 freegeoip 结合使用 在我的生产应用中运行良好(freegeoip 有时会检测到错误的国家,但它是免费的)
【讨论】:
以上是关于Rails:操作错误“CarsController#show 中的 Timeout::Error”的主要内容,如果未能解决你的问题,请参考以下文章
Rails ajax 调用同时产生 404 和 500 错误