2011-04-26 65 views
0

我在Rails 3應用程序中遇到了to_json方法的一個奇怪問題。 (嗯,至少我認爲它是與to_json做)Rails to_json問題

在我的控制,我得到存儲在數據庫中

@libraries = Library.where("latitude IS NOT NULL AND longitude IS NOT NULL") 

然後我創建一個包含JSON文件的所有庫的列表上面的圖書館信息。

my_file = File.new("public/javascripts/libraries.json", "w") 
my_file.write "var libs = {'libraries' : " 
my_file.write @libraries.to_json(:only => [ :id, :name, :address, :latitude, :longitude ]) 
my_file.write "};" 

然後在我看來,我展示谷歌地圖上的每個庫對象。在視圖文件中,我正在通過將libraries.json文件加載爲JavaScript文件來讀取json文件。

現在的問題是庫對象顯示在谷歌地圖SOMETIMES,但不是所有的時間,並通過Firebug,我能夠確定有時「js文件中包含的」libs「變量是「不確定」。

這讓我覺得文件還沒有被完全寫入,或者文件中的數據還沒有被完全加載。但我不太確定它是什麼。

有沒有人有一個想法可能導致這種情況?

回答

0

是的,這可能是由於您將其寫入文件而不是將其包含在標記中而造成的。因爲可能發生的事情(有時)是服務器獲取請求,寫入json文件,然後渲染視圖並將該視圖發送給客戶端。然後通知客戶端加載libraries.json文件,導致向服務器發送另一個請求以檢索該文件。但是如果那個文件在那個時刻被重寫,因爲另一個客戶端同時發送了一個請求呢?它會失敗。

還有一些其他的方法,你可以去這個問題。首先,可能最快起牀,跑步是包括這在你的控制器和視圖,而不是寫入文件:

#controller 
@libraries = Library.where("latitude IS NOT NULL AND longitude IS NOT NULL").to_json(:only => [ :id, :name, :address, :latitude, :longitude ]) 

#view 
<script type="text/javascript"> 
var libs = {'libraries': <%= @libraries.html_safe %>} 
</script> 

但是一個更好的解決方案可能會安排一些工作或任務加載庫從程序間隔數據庫,並寫入到一個JSON文件,每天一次,也許是因爲我想這是不是真的有必要,除非他們從一分鐘到下一個改變從數據庫加載這些所有的時間。

1

我不太確定問題出在那裏,但我認爲它與您正在創建的文件有關。

我建議你simply return the json data to the view然後你可以在客戶端使用JavaScript或jQuery或任何其他框架來處理它。

這樣你也可以通過在Firebug中查看數據來確保數據是正確的。

OR

而不是使其成爲一個文件,只需hold the json data in a variable然後你就可以訪問視圖中的變量。
爲什麼要創建一個文件的麻煩,當你沒有它可以做到這一點。

原因:

  1. 創建一個文件是一個IO的過程,這將增加成本。
  2. 每一次,您從視圖中獲取數據,您將進行一次獲取調用,再次是IO調用。你可以通過將它放入一個變量來完成同樣的事情,這樣它就可以存儲在內存中。

我是這麼說的,因爲每次你創建一個新文件,並且你在當前http調用之前創建的文件都沒有用了。