Rails缓存部分布局呈现两次

时间:2011-09-01 21:08:31

标签: ruby-on-rails caching layout

我正在尝试缓存在布局中呈现的部分。这个部分计算量很大,所以我只想计算一次。它不是特定于控制器的,因此通常的片段缓存似乎不适用。我决定使用Rails.cache.fetch('menu')代替缓存。以下是部分内容的内容。

<% Rails.cache.fetch('menu') do %>
  Partial code...
<% end %>

但是当我这样做时,它会将部分渲染两次。出于某种原因,它在我的开发环境中停止这样做,所以我决定尝试部署它。我的生产环境不太幸运。部分本身会生成一个菜单,其中包含指向站点中许多记录的链接,以帮助改进导航。

我最初尝试将缓存语句放在布局文件中,但后来渲染了布局两次。

我最近添加了一个jQuery hack来删除重复的html,以便它现在有点“工作”,但我宁愿让它正常工作。我不想去安装一些复杂的缓存系统,比如Redis,这需要我运行另一个服务器程序。这对任务来说太过分了。 rails中必须有一些非常适合缓存部分布局的东西。

我应该尝试一些完全不同的东西,或者这是rails中的错误?如果它是一个bug,那么我可以使用一种解决方法吗?

2 个答案:

答案 0 :(得分:3)

我明白了。我没有在视图中缓存部分,而是创建了一个返回渲染部分的辅助方法。

#Returns a menu for the application layout
def menu
  Rails.cache.fetch('menu') { render :partial => 'all/menu' }
end

然后我在布局中需要的就是这一行     &lt;%menu%&gt;

答案 1 :(得分:0)

尝试清除生产缓存。有可能你有一个逻辑错误导致它渲染两次。在开发过程中,缓存通常被禁用,这就是为什么当你修复问题时它会在开发过程中消失。如果您已重新部署,问题可能也从生产代码中消失,但如果缓存尚未清除,它将继续显示缓存的逻辑错误。