2014-10-27 61 views
0

尝试访问网页时发生超时异常。 在控制方法或辅助方法,试图让本地URL的内容:如何从Rails中的控制器方法获取本地url的内容?

require 'open-uri' 
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json')) 

结果得到超时错误。 如果我在irb中运行这个代码,它会工作。

我怎样才能正确得到本地网址的内容在铁轨?

+0

我有点怀疑你是否需要“http://0.0.0.0:3000”。你检查了日志,看看rails是否得到这个文件? – argentum47 2014-10-27 07:54:16

+0

尝试打开时失败('http://0.0.0.0:3000/notebookcheck/cpus.json') – ambi 2014-10-27 08:20:52

回答

0

我认为你需要打开该文件后添加.read

require 'open-uri' 
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json').read) 
+0

没有用,同样的问题 - Timeout :: Error – ambi 2014-10-27 18:51:15

1

直觉:

这是发生,因为请求被依次处理。

假设你有两个请求。一种是查看页面A,另一种是查看页面B.

但是,查看页面A完成之前,无法满足查看页面B的请求。

在你的情况下,你创建了一个依赖项:页面A 不能完成渲染,直到页面B呈现。但是,直到先前的所有请求(在这种情况下,呈现页面A的请求)完成之前,页面B才会呈现。

总之,完成读取请求取决于请求的页面加载。

这里发生了什么:

您的要求来渲染JSON无法完成,直到原始请求完成 - 这样的进程挂起。

最终,它等待时间过长,超时。

发生这种情况是因为与其他语言(例如Javascript)不同,Ruby请求在单线程(即同步,而不是异步)上运行时被阻塞。

解决方案:

请注意,如果你正在运行多个进程线程,这会工作。看到这个SO answer ..

但是,你可以直接渲染文件,直接使用Rails中的render_to_string方法进行字符串处理。

祝你好运。

相关问题