如何使控制台中的视图缓存片段过期?

Posted

技术标签:

【中文标题】如何使控制台中的视图缓存片段过期?【英文标题】: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新增缓存删除方法 【参考方案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/…

以上是关于如何使控制台中的视图缓存片段过期?的主要内容,如果未能解决你的问题,请参考以下文章

如何使控制器中的缓存数据 [OutputCache] 无效?

如何使控制器数据覆盖 Laravel 中的视图控制器?

http缓存控制

Rail片段缓存如何使您的应用受益,即阻止数据库调用?

在 Rails 6 中更新底层模型时如何使动作缓存过期?

如何缓存片段视图