【问题标题】:Rails asset pipeline: How to prevent caching of a specific assetRails 资产管道:如何防止缓存特定资产
【发布时间】:2013-05-19 20:09:46
【问题描述】:

如标题中所述,我想防止缓存特定资产,即 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 每次被请求时都被渲染。

这可能吗?

环境信息:

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

谢谢

【问题讨论】:

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


    【解决方案1】:

    我可以建议 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");
    

    【讨论】:

    • 使用内联 js 设置变量:我一开始就试图避免这种风格。 将变量存储在您的 html 中并从您的 js 中调用它 我认为这比第一个更难看:(
    【解决方案2】:

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

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

    例如:

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

    【讨论】:

    • 1- 前端业务逻辑应该如何在没有数据的情况下进行?从逻辑上讲,一旦 HTML 被加载,通过 AJAX 获取数据并在编译时将数据绑定到 js 之间没有区别。最后,在需要时,这两个数据都可用于 js 上下文。 2-数据很大,这是我试图避免在 dom 上准备好初始 AJAX 的主要原因。
    • 1) 我没有说逻辑在没有数据的情况下运行,你不需要从一个极端走到另一个极端。区别非常显着:关注点分离、客户端性能、不破坏您的架构等。 2) 特别是如果这是大量数据,您应该异步加载它(咳嗽,AJAX),以免保留主线程在您这样做时做出回应。如果您在应用程序中设置了适当的 HTTP 缓存,这允许客户端缓存 JS 以及数据,而不是两者都没有。您还可以避免对 JS 的每个请求都运行缩小。
    • 换句话说,有一个完善的模式可以做你想做的事,它很适合你的架构,但是你却碰壁了,因为你坚持非标准的设计这并没有提供任何好处(除了可以说代码略少)。
    • 首先,感谢 cmets。好吧,也许我不能说清楚。数据相当大,页面需要渲染,所以我不希望客户端浪费时间等待 AJAX 响应。此外,AJAX 将是一个(不必要的)额外调用,会使服务器保持忙碌。因此,由于这是可以避免的,所以我试图避免它。然后你会问“为什么用 js 渲染页面,用 erb 渲染”,这是另一个源于应用程序性质的“架构”要求。
    • 我真的需要这种用法并最终将数据放在 html 中的 &lt;scripts&gt; 标记之间。我想这更丑陋,一旦在闭包等中使用数据就需要从全局范围中清除……我真的希望能够将 Rails 中的 json 直接动态绑定到 javascript 文件中。
    猜你喜欢
    • 1970-01-01
    • 2013-04-01
    • 2011-10-04
    • 2014-11-07
    • 2011-12-01
    • 2012-08-29
    • 2012-04-17
    • 2011-12-15
    • 1970-01-01
    相关资源
    最近更新 更多