如何在rails应用程序中缓存动态页眉/页脚?

时间:2014-02-12 20:44:13

标签: ruby-on-rails ruby caching before-filter

假设我有一个带有以下布局的简单应用

<html>
<head>...</head>
<body>
    <%= render :partial => 'layouts/header' %>  
    <%= yield %>
    <%= render :partial => 'layouts/footer' %>
</body>
</html>

我的页眉和页脚部分非常简单,但它们需要动态数据,需要几毫秒才能从数据库中获取。现在,我在应用程序控制器中使用before_action:方法获取头数据,因为它需要在所有页面上(Ajax调用除外):

before_action :prepare_header

private 
def prepare_header
    @news = ... 
end

如何缓存prepare_header操作或header.erb.html。 我正在使用Rails 4.0.0

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以在视图中使用片段缓存来完成。

您的@news变量是根据某些数据计算的,例如params[:a], params[:b] and params[:c]。基于此,您可以使用缓存块

包装标题(然后部分)
<% cache([params[:a], params[:b], params[:c], 'header']) do %>
  you html code here
<% end %>

根据所需的控制变量,您可以拥有部分的缓存版本。有关视图缓存的更多信息,请查看here

一个好的做法是为cache_key添加更多控件,以便按需使其无效,例如:

cache([cache_key_1, cache_key_2, version_number])

当某些内容发生变化时,您会碰撞version_number并相应地失效!

当然是expires_at参数。

<强>更新

对于动作缓存,您可以尝试this gem。并将你想要的参数传递给你 if: Proc { ... }

参数