尝试访问网页时发生超时异常。 在控制方法或辅助方法,试图让本地URL的内容:如何从Rails中的控制器方法获取本地url的内容?
require 'open-uri'
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json'))
结果得到超时错误。 如果我在irb中运行这个代码,它会工作。
我怎样才能正确得到本地网址的内容在铁轨?
尝试访问网页时发生超时异常。 在控制方法或辅助方法,试图让本地URL的内容:如何从Rails中的控制器方法获取本地url的内容?
require 'open-uri'
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json'))
结果得到超时错误。 如果我在irb中运行这个代码,它会工作。
我怎样才能正确得到本地网址的内容在铁轨?
我认为你需要打开该文件后添加.read
:
require 'open-uri'
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json').read)
没有用,同样的问题 - Timeout :: Error – ambi 2014-10-27 18:51:15
直觉:
这是发生,因为请求被依次处理。
假设你有两个请求。一种是查看页面A,另一种是查看页面B.
但是,查看页面A完成之前,无法满足查看页面B的请求。
在你的情况下,你创建了一个依赖项:页面A 不能完成渲染,直到页面B呈现。但是,直到先前的所有请求(在这种情况下,呈现页面A的请求)完成之前,页面B才会呈现。
总之,完成读取请求取决于请求的页面加载。
这里发生了什么:
您的要求来渲染JSON无法完成,直到原始请求完成 - 这样的进程挂起。
最终,它等待时间过长,超时。
发生这种情况是因为与其他语言(例如Javascript)不同,Ruby请求在单线程(即同步,而不是异步)上运行时被阻塞。
解决方案:
请注意,如果你正在运行多个进程或线程,这会工作。看到这个SO answer ..
但是,你可以直接渲染文件,直接使用Rails中的render_to_string
方法进行字符串处理。
祝你好运。
我有点怀疑你是否需要“http://0.0.0.0:3000”。你检查了日志,看看rails是否得到这个文件? – argentum47 2014-10-27 07:54:16
尝试打开时失败('http://0.0.0.0:3000/notebookcheck/cpus.json') – ambi 2014-10-27 08:20:52