尝试访问网页时出现超时异常。 在控制器方法或帮助方法中尝试获取本地URL的内容:
require 'open-uri'
data = JSON.load(open('http://0.0.0.0:3000/notebookcheck/cpus.json'))
结果导致超时错误。 如果我在irb中运行此代码,它将起作用。
如何正确获取rails中本地URL的内容?
答案 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)