2011-12-19 45 views
1

我正在开发一个使用Rails 3.1的极其JavaScript的应用程序。我已经开发了一个“管理”区域,可以通过Web界面使用Rails模型自行配置应用程序。预计这部分数据库很少发生变化,但我需要有能力更改它,因此管理员。将不经常更改的JSON数据发送到生产中的客户端的最佳方法

我现在正在制定将数据下载到浏览器的最佳方法。我需要客户端在JavaScript应用程序本身可以启动之前加载数据,因此如果可能的话,我想避免任何AJAX调用,因为这些后续请求必须先完成。

由于数据很少发生变化,因此它非常适合缓存 - 但在这种情况下,我无法使用资产管道,因为我不希望在模型中重新部署Rails应用程序数据变化。

我不能在资产中使用嵌入式ERB代码,因为即使我不预编译它们,实际的资产文件也必须在Rails接受修改之前进行更改。即使模型数据已经改变,由于ERB代码没有被修改,即使我触摸文件(以更新时间戳),Rails也不会为我生成新的资产文件,因为它的MD5哈希值没有改变。

在这一点上,我打算将JSON模型直接分解并嵌入到视图模板中,但我很讨厌这样做(数据和视图分离以及所有这些)。

是否有更好的解决方案,比如强制Rails/Sprockets重新编译特定资产的程序化方法,或者所有这些方案?

回答

0

现在,我决定使用respond_to为它创建一个控制器和JavaScript视图。例如:

class ConfigurationController < ApplicationController 
    def index 
    respond_to do |fmt| 
     fmt.js 
     # ... 
    end 
    end 
end 

此控制器的JS视图吐出模型数据:

<% InfrequentlyChangingModel.all.each do |record| %> 
    AppData[<%= record.id %>] = (<%= record.to_json.html_safe %>); 
<% end %> 

然后在前端视图我引用它像任何其他JavaScript文件:

<%= javascript_include_tag 'configuration' %> 

我仍然对其他建议持开放态度,但这是迄今为止我能够提出的最干净,最Rails的解决方案。它预先产生了一个额外的请求(用于js文件),但应该很好地缓存,并避免额外的AJAX。

+0

我正在向我的.erb添加一个版本,当我想要它重新编译时(如果没有其他更改),我会碰撞。非常不雅。 – Hollownest 2012-08-17 03:37:06

相关问题