【问题标题】:Rails Cached partial in layout is rendered twiceRails Cached 部分布局被渲染两次
【发布时间】: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


【解决方案1】:

我想通了。我没有在视图中缓存部分内容,而是创建了一个帮助方法来返回呈现的部分内容。

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

那么我在布局中只需要这一行

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我在开发中启用了缓存。仍然不知道为什么它在开发中消失​​了。在生产中,如果我重新启动服务器,那么下次有人访问该站点时会重新计算部分。这并没有解决问题。
    • 重启服务器不会重新计算部分。部分仅通过清除缓存重新计算。重启 rails 不会清除缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2020-03-08
    • 2023-03-13
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多