将不经常更改的JSON数据发送到生产中的客户端的最佳方法

时间:2011-12-19 18:34:21

标签: caching ruby-on-rails-3.1 asset-pipeline

我正在使用Rails 3.1开发一个非常JavaScript的应用程序。我开发了一个“管理”区域,可以通过Web界面使用Rails模型自行配置应用程序。预计数据库的这一部分很少会发生变化,但我需要能够更改它,因此需要管理员。

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

由于数据很少发生变化,因此它是缓存的理想选择 - 但在这种情况下我无法使用资产管道,因为我不想在模型数据时重新部署Rails应用程序变化。

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

此时我即将分解并将JSON模型直接嵌入到视图模板中,但我不愿意这样做(分离数据和视图,以及所有这些)。

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

1 个答案:

答案 0 :(得分: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。