如何从Rails中的控制器方法获取本地url内容?

时间:2014-10-27 07:42:01

标签: ruby-on-rails ruby json webrick

尝试访问网页时出现超时异常。 在控制器方法或帮助方法中尝试获取本地URL的内容:

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

结果导致超时错误。 如果我在irb中运行此代码,它将起作用。

如何正确获取rails中本地URL的内容?

2 个答案:

答案 0 :(得分:1)

<强>直觉:

这种情况正在发生,因为正在按顺序处理请求。

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

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

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

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

这里发生了什么:

在原始请求完成之前,您呈现JSON的请求无法完成 - 因此该过程会挂起。

最终,它等待的时间太长而且只是超时。

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

<强>解决方案:

请注意,如果您运行多个进程线程,则可以使用。见SO answer ..

但是,您可以直接使用Rails中的render_to_string方法将文件直接渲染为字符串,而不是生成线程。

祝你好运。

答案 1 :(得分:0)

我认为您需要在打开文件后添加.read

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