Rails资产管道:如何防止特定资产的缓存

时间:2013-05-24 09:08:55

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

如标题中所述,我希望阻止特定资产的缓存,即javascript文件something.js.erb。情况如下:

something.js.erb的内容:

...
var something = <%= SomethingHelper.get_something.to_json %>;
...

它成功绑定SomethingHelper的值,但仅限一次,除非手动编辑javascript文件,否则永远不会再分配var something的值。

这可能会以某种方式预期,但显然无法满足我的需求。 SomethingHelper.get_something的输出根据通话时间而变化。所以我需要在我编译的something.js文件中查看最新数据。

我的确切需要:

  • 我不想整体禁用资产管道缓存
  • 我只想在每次请求时都呈现something.js.erb

这甚至可能吗?

环境信息:

  • Rails 4
  • 开发模式
  • Rails自己的服务器,但将在prod上的nginx

由于

2 个答案:

答案 0 :(得分:0)

我可以建议2个选项:

1)使用内联js设置变量:

<%= javascript_tag do %>
  window.something = '<%= j SomethingHelper.get_something.to_json %>';
<% end %>

2)将变量存储在html中并从js中调用它:

#html

<body data-something="<%= j SomethingHelper.get_something.to_json %>">
</body>

#js

$("body").data("something");

答案 1 :(得分:0)

您正在将前端业务逻辑与数据结合在一起。这是不可取的,也是我不使用或推荐在大多数情况下使用ERB + JS的原因之一(尤其是像Rails教程和指南一样的响应触发行为都热衷于这样做)。你最好还是......

  1. 关闭请求以从JavaScript获取数据。
  2. 如果变量将在每个页面上使用(或接近它)并且是相对简短的非二进制数据,则可以在布局中嵌入meta标记以及相关信息。
  3. 例如:

    # /app/views/layouts/application.html.erb
    <%= tag :meta, name: 'something', content: @something %>
    
    # /app/assets/javascripts/application.js
    $('meta[name="something"]').attr('content');