【问题标题】:How do I expire a view cached fragment from console?如何使控制台中的视图缓存片段过期?
【发布时间】:2010-10-19 21:42:17
【问题描述】:

有点像

Rails.cache.delete('site_search_form')

似乎不起作用。这可能吗?谢谢。

【问题讨论】:

  • 你运行的是什么版本的 Rails? 2.1新增缓存删除方法

标签: ruby-on-rails ruby caching actionview


【解决方案1】:

缓存片段条目的创建键与您使用 Rails.cache 访问的键略有不同。

改用expire_fragment(您可以将其发送到控制器):http://api.rubyonrails.org/classes/ActionController/Caching/Fragments.html#M000438

【讨论】:

  • 这对我不起作用。如果这对您也不起作用,请尝试Rails.cache.delete_matched 'views/site_search_form*'
  • 从 Rails 3 开始,片段缓存的末尾有一个哈希值,它基于生成它们的视图的内容。这样一来,如果视图发生更改,缓存就会自动被破坏,但它很难按键过期。你可以告诉 Rails 不要在缓存调用中添加带有skip_digest: true 的哈希值。更多信息:reinteractive.net/posts/…
【解决方案2】:

在 Rails 5 中,我采取了以下步骤来破坏缓存,而不使用 skip_digest: true。我们的问题是更改 I18n 字符串的值不会反映在计算的缓存摘要中,因此缓存不会自动被破坏。

这是定义缓存块的视图:

/ views/layouts/_footer.html.slim
- cache :footer do
  span= t('shared.footer')

然后在 rails 控制台我运行:

fragment = ActionController::Base.new.view_context.cache_fragment_name(:footer, virtual_path: 'layouts/_footer.html.slim')
ActionController::Base.new.expire_fragment(fragment)

cache_fragment_name 将根据 virtual_path 关键字参数计算摘要。

【讨论】:

    【解决方案3】:
    Rails.cache.delete "views/site_search_form"
    

    【讨论】:

      【解决方案4】:

      ActionController::Base.new.expire_fragment(key)

      【讨论】:

      • ruby-1.8.7-p334 :007 > ActionController::Base.new.expire_fragment(:controller => 'main', :action => 'index') NoMethodError: undefined method `host_with_port'对于 nil:NilClass
      • 从 Rails 3 开始,片段缓存的末尾有一个哈希值,它基于生成它们的视图的内容。这样一来,如果视图发生更改,缓存就会自动被破坏,但它很难按键过期。你可以告诉 Rails 不要在缓存调用中添加带有skip_digest: true 的哈希值。更多信息:reinteractive.net/posts/…
      猜你喜欢
      • 2012-07-02
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多