【问题标题】:Rails - fragment cache not expiringRails - 片段缓存不会过期
【发布时间】:2009-05-22 05:45:15
【问题描述】:

这个让我难过。

我有一个缓存片段的视图:

 - cache :key=>"news" do    
   %h2 News
   - etc

我有一台扫地机,它使用:

def expire_home_cache
  puts "expire_home_cache"
  expire_fragment(:key => "news") 
end

因为我可以在控制台输出中看到“expire_home_cache”,所以调用了清扫器。

但是片段没有更新……

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby caching fragment


    【解决方案1】:

    尝试将expire_fragment(:key => "news") 替换为ActionController::Base.new.expire_fragment(:key => "news")

    没有时间解释,但它对我有用。

    【讨论】:

    • 确保将 --- cache_sweeper :whatever_sweeper --- 放在 application_controller.rb 中,以使上述内容正常工作。
    • 我遇到了一个无法解释的情况,在我尝试这个答案并且它奏效之前,清扫器会拒绝使子关联的缓存过期。我不明白为什么。清扫器回调被调用,expire_fragment 代码也是如此。奇数。
    • 我不知道为什么,但我得到了类似的结果:expire_fragment(key) 不起作用,但是当我在调用前面加上 logger.warn(最初只是为了查看 expire_fragment 的输出)片段过期突然像一个魅力。令人困惑。
    • 很棒的提示,它有效。但如果你有时间,我想看看解释......
    【解决方案2】:

    你可以试试这个:

       cache("news") do    
         %h2 News
         - etc
       end
    

    还有……

    def expire_home_cache
      puts "expire_home_cache"
      expire_fragment("news") 
    end
    

    ...或者试试这个...

     - cache({:key=>"news"}) do    
       %h2 News
       - etc
    

    我认为问题可能是 ruby​​ 或 rails 很难确定密钥到底是什么,因此缓存方法和 expire_fragment 正在生成两个不同的缓存密钥。

    【讨论】:

    • 在 Rails 4.x 中你可能还需要cache("news", skip_digest: true)
    【解决方案3】:

    正确的做法是:

    cache :news do
    
      ...
    end
    

    然后在你的扫地机中:

    expire_fragment :news
    

    【讨论】:

    • 所以key应该是一个符号,而不是字符串?
    • 您可以将其设为字符串或符号,但不必是哈希。
    【解决方案4】:

    这并不能直接回答您的问题,但是您是否尝试过 timed_fragment_cache 插件作为替代方案?

    http://github.com/tricycle/timed_fragment_cache/tree/master

    我发现这是在我的项目中使片段过期的一种更简单的方法。

    【讨论】:

      猜你喜欢
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多