Rails to_json问题

时间:2011-04-26 11:35:40

标签: json ruby-on-rails-3

我的Rails 3应用程序中的to_json方法存在一个奇怪的问题。 (至少我认为这与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 "};"

然后在我看来,我在Google Map上显示每个库对象。在视图文件中,我通过将libraries.json文件作为javascript文件加载来读取json文件。

现在问题是库对象显示在谷歌地图上有时候,但不是所有的时间,并且通过Firebug,我能够确定JSON文件中包含的“libs”变量有时是“未定义”。

这使我认为文件尚未完全写入,或者文件中的数据尚未完全加载。但我不太确定它是什么。

有没有人知道造成这种情况的原因是什么?

2 个答案:

答案 0 :(得分:1)

我不太清楚为什么会出现问题,但我认为它与您正在创建的文件有关。

我建议您simply return the json data to the view,然后您可以使用javascript或jquery或任何其他框架在客户端处理它。

通过这种方式,您还可以通过在Firebug中查看数据来确保数据正确无误。

而不是将其设为文件,只需hold the json data in a variable,然后您就可以访问视图中的变量了 为什么要在没有它的情况下完成创建文件的麻烦。

原因:

  1. 创建文件是一个IO过程,这会增加成本。
  2. 每次从视图中获取数据时,您都会进行提取调用,再次进行IO调用。你可以通过将它放在一个变量中来做同样的事情,这样它就会在内存中存在。
  3. 我是这样说的,因为每次都是在创建一个新文件,而且你在当前http调用之前创建的文件已经消失,没有用。

答案 1 :(得分: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文件,因为我认为没有必要从数据库加载这些所有的时间,除非他们从一分钟变为下一分钟。