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 - 电子邮件确认链接给出“未知操作”错误

用于操作(更新、删除等)和错误检查的 Rails 模式

Rails 迁移错误

Rails ajax 调用同时产生 404 和 500 错误

Rails:Vanilla Rails 6.0 错误命令“webpack”未找到

使用 Rails 完全自定义验证错误消息