我一直在努力解决ActiveResource的问题:当主机名解析ActiveResource请求,但另一端没有服务器返回信息时,ActiveResource的超时值不起作用。请求刚刚挂起。
在查看ActiveResource代码之后,我意识到这是因为底层的Net:Http对象只设置了一个超时值:read_timeout。 Net:Http库将其定义为“等待读取一个块(通过一次读取(2)调用)”的秒。 Net:Http lib还定义了另一个超时值open_timeout,定义为“等待直到连接打开的秒数”。
我不确定为什么默认情况下没有设置open_timeout并且在ActiveResource类上设置超时值,但是在修改ActiveResource :: Connection类以在http对象上包含open_timeout之后,我的问题已经解决了!
我是rails的新手,所以我不确定在我的项目中实际进行此修改的最佳方法;我不想只更改gem目录中的代码。是否有适当的方法在rails项目中进行这些修改?我已经看到可以从/ vendor文件夹加载rails类,但它们是否都必须在那里才能工作?我开始创建ActiveResource :: Base和ActiveResource :: Connection类的子类,但似乎有一种更简单的方法可以做到这一点,因为创建Net:Http实例的函数是私有的...任何想法?
答案 0 :(得分:3)
首先,这是一个你应该向Rails的bugtracker报告的问题: https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/
当我必须修补这些小事时,我通常在RAILS_ROOT / config / initializers中创建一个初始化文件,然后重新打开我打算修复的类。
class ActiveResource::Base
# your fix goes here
end
这称为猴子修补,有点争议。但我个人认为在继承层次结构中引入一个对我的代码没有语义含义的新级别是非常残酷的。