2014-10-27 58 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方法進行字符串處理。

祝你好運。

相關問題