ruby-on-rails - 使用 stylesheet_link_tag 缓存 Rails 4 片段

标签 ruby-on-rails caching ruby-on-rails-4 memcached sprockets

Rails 4 使用 cache_digests ( https://github.com/rails/cache_digests ) 来帮助片段缓存失效:cache_digests 创建模板及其所有已知依赖项的 MD5 哈希,允许片段缓存通过在模板或其依赖项更改时分配新键而失效。

我的问题是:片段缓存是否会包装 stylesheet_link_tag如果 application.css 文件的 MD5 哈希值在 rake assets:precompile 期间发生更改,则无效?现在在我们的标题中执行此操作:

<% cache("header-cache-key") do %>
  <%= stylesheet_link_tag "application" %>
  <%= javascript_include_tag "application" %>
<% end %>

这安全吗?我担心的是,当 CSS 或 JS 发生变化时,application-xxxxxxx.css会变成application-yyyyyyy.css ,但我们的 header 将与旧的 application-xxxxxxx.css 一起缓存.那么如果 application-xxxxxxx.csspublic/assets 消失了,这将导致一个丑陋的页面。

最佳答案

不,缓存不会在更改已编译的 CSS/JS 时被破坏/无效。

Rails 在代码更改时破坏缓存的方式是通过将文件的哈希插入 View 的缓存键来完成的。

例如,假设您在 app/views/layouts/application.html.erb 处有一个 View 文件. Rails 从文件的内容(即 HTML/Ruby 代码,而不是执行的输出)生成一个哈希值。让我们假设生成的哈希是“abdefg123”。

application.html.erb具有以下缓存代码:

<% cache("header-cache-key") do %>
  <%= stylesheet_link_tag "application" %>
  <%= javascript_include_tag "application" %>
<% end %>

生成的实际缓存键类似于 "views/layouts/application-abcdefg123/header-cache-key" .

由于已编译的 CSS/JS 中的更改实际上并未更改文件中的 Ruby/HTML,因此布局代码的计算哈希值不会更改,因此“header-cache-key”的缓存键是相同的,这意味着缓存没有被破坏。

关于ruby-on-rails - 使用 stylesheet_link_tag 缓存 Rails 4 片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26748866/

相关文章:

ruby-on-rails - rails : Filter sensitive data in JSON parameter from logs

c# - asp.net core 3 响应缓存未按预期工作

ruby-on-rails - 长加工;定期发送 102 处理响应的方法?

ruby - 从 Heroku 恢复本地数据库后的 ActiveRecord::PendingMigrationError

ruby-on-rails - Ruby on Rails-不兼容的编码(marshal)文件格式

ruby-on-rails - 如果条件与 &&,是否有任何性能提升

ruby-on-rails - rails 3路线: DRY members

ruby-on-rails - 为什么 Rails 尝试在生产环境中自动加载此文件?

java - 了解客户端和服务器

performance - 至强 CPU (E5-2603) 后向内存预取