清除Rails应用程序中的布局缓存

时间:2014-11-09 18:15:15

标签: html ruby-on-rails caching ruby-on-rails-3.2

我的application.html.slim模板在概念上看起来像这样:

/ some stuff
= header()
/ more stuff
= yield
/ more stuff
= footer()

现在header()footer()是从外部源加载的,它们是特定于语言的。

我已经引入了语言更改机制(基于URL),因此只要语言发生更改,headerfooter就会从其他来源加载。

我的问题:

  • 我启动服务器
  • 我加载http://myserver.dev/en
  • 内容和标题以英语显示 - >的确定
  • 我加载http://myserver.dev/de
  • 现在标题仍为英文,而内容为德文 - > 不行
  • 现在页眉和页脚不会改变,直到我再次重新启动服务器。

那么如何清除布局缓存,以便重新加载footerheader

我尝试了以下(无济于事):

  • 手动从磁盘中删除缓存文件(它们似乎仍在内存中)
  • 在我的application.rb

    中添加以下设置
    config.action_view.cache_template_loading = false
    config.action_controller.perform_caching = false
    
  • 每个请求
  • 中调用Rails.cache.clear
  • 尝试使个别部分过期:expire_fragment('external/_header.html.slim')expire_fragment(%r{external})

2 个答案:

答案 0 :(得分:1)

我使用片段缓存并为每种语言创建块缓存来避免这种情况。

在视图中定义块,您将使用以下内容更改语言:

<% cache("block_1_#{I18n.locale}") do %>
  ...
<% end %>

答案 1 :(得分:0)

由于@gabrimac的帖子我解决了这个问题:

所以当我在视图中定义一个特殊的缓存键时,如下所示:

- cache("language_dependant_partial") do 
  = ApplicationHelper::footer()

然后我可以使用此特定标识符使缓存无效:

before_filter :clear_cache

def clear_cache

  # TODO: This currently clear's the cache on every request
  expire_fragment('language_dependant_partial')
end