【发布时间】:2011-09-02 21:07:55
【问题描述】:
我正在尝试缓存在布局中呈现的部分。这个部分计算量很大,所以我只想计算一次。它不是特定于控制器的,因此通常的片段缓存似乎并不适用。我决定使用 Rails.cache.fetch('menu') 来代替缓存。下面是部分内容的样子。
<% Rails.cache.fetch('menu') do %>
Partial code...
<% end %>
但是当我这样做时,它会渲染部分两次。由于某种原因,它在我的开发环境中停止了这样做,所以我决定尝试部署它。我的生产环境并不那么幸运。部分本身会生成一个菜单,其中包含指向站点中许多记录的链接,以帮助改进导航。
我最初尝试将缓存语句放在布局文件中,但后来它渲染了两次布局。
我最近添加了一个 jQuery hack 来删除重复的 html,以便它现在有点“工作”,但我宁愿让它正常工作。我不想麻烦安装一些复杂的缓存系统,例如 Redis,这需要我运行另一个服务器程序。这对这项任务来说太过分了。 rails 中一定有一些东西非常适合缓存部分布局。
我应该尝试一些完全不同的东西还是这是 Rails 中的错误?如果这是一个错误,那么我可以使用什么解决方法?
【问题讨论】:
-
也许您应该尝试只缓存计算量大的查询(我假设它是一个 dbquery?)?我发现 Heroku 文章对 Rails 缓存很有用 devcenter.heroku.com/articles/caching-strategies
-
我可以尝试缓存查询。我构建菜单的方式涉及很多单独的查询。现在,这一切都内置在主要部分调用的子部分中。子部分递归调用自身。
-
将所有查询移至应用程序控制器需要进行大量更改。我想知道 render_to_string 是否可以在应用程序控制器中正确缓存?然后我可以只渲染一个字符串并将字符串传递给布局。我会试试的。
标签: ruby-on-rails caching layout