跳至内容 跳至搜索

抽象控制器 Caching Fragments

片段缓存用于缓存视图中的各种块,而无需缓存整个操作。这在操作的某些元素频繁更改或依赖于复杂状态,而其他部分很少更改或可以在多个方之间共享时很有用。缓存是使用 Action View 中可用的 cache 助手完成的。有关更多信息,请参阅 ActionView::Helpers::CacheHelper

虽然强烈建议您使用基于键的缓存过期(有关更多信息,请参阅 CacheHelper 中的链接),但也可以手动过期缓存。例如

expire_fragment('name_of_cache')
命名空间
方法
C
E
F
R
W

实例公共方法

combined_fragment_cache_key(key)

给定一个键(如 expire_fragment 中所述),返回一个适合用于读取、写入或过期缓存片段的键数组。所有键都以 :views 开头,如果设置了,则后跟 ENV["RAILS_CACHE_ID"]ENV["RAILS_APP_VERSION"],然后是任何控制器范围的键前缀值,最后是指定的 key 值。

# File actionpack/lib/abstract_controller/caching/fragments.rb, line 68
def combined_fragment_cache_key(key)
  head = self.class.fragment_cache_keys.map { |k| instance_exec(&k) }
  tail = key.is_a?(Hash) ? url_for(key).split("://").last : key

  cache_key = [:views, ENV["RAILS_CACHE_ID"] || ENV["RAILS_APP_VERSION"], head, tail]
  cache_key.flatten!(1)
  cache_key.compact!
  cache_key
end

expire_fragment(key, options = nil)

从缓存中删除片段。

key 可以采用以下三种形式之一

  • 字符串 - 这通常采用路径的形式,如 pages/45/notes

  • 哈希 - 被视为对 url_for 的隐式调用,如 { controller: 'pages', action: 'notes', id: 45}

  • 正则表达式 - 将删除任何匹配的片段,因此 %r{pages/\d*/notes} 可能会删除所有笔记。确保您在正则表达式中不使用锚点(^$),因为匹配的实际文件名看起来像 ./cache/filename/path.cache。注意:正则表达式 过期仅在可以迭代所有键的缓存(不像 memcached)上受支持。

options 会传递给缓存存储的 delete 方法(或 delete_matched,对于 正则表达式 键)。

# File actionpack/lib/abstract_controller/caching/fragments.rb, line 131
def expire_fragment(key, options = nil)
  return unless cache_configured?
  key = combined_fragment_cache_key(key) unless key.is_a?(Regexp)

  instrument_fragment_cache :expire_fragment, key do
    if key.is_a?(Regexp)
      cache_store.delete_matched(key, options)
    else
      cache_store.delete(key, options)
    end
  end
end

fragment_exist?(key, options = nil)

检查由 key 指定的位置是否有缓存的片段存在(有关可接受的格式,请参阅 expire_fragment)。

# File actionpack/lib/abstract_controller/caching/fragments.rb, line 105
def fragment_exist?(key, options = nil)
  return unless cache_configured?
  key = combined_fragment_cache_key(key)

  instrument_fragment_cache :exist_fragment?, key do
    cache_store.exist?(key, options)
  end
end

read_fragment(key, options = nil)

从由 key 指定的位置读取缓存的片段(有关可接受的格式,请参阅 expire_fragment)。

# File actionpack/lib/abstract_controller/caching/fragments.rb, line 93
def read_fragment(key, options = nil)
  return unless cache_configured?

  key = combined_fragment_cache_key(key)
  instrument_fragment_cache :read_fragment, key do
    result = cache_store.read(key, options)
    result.respond_to?(:html_safe) ? result.html_safe : result
  end
end

write_fragment(key, content, options = nil)

content 写入由 key 指定的位置(有关可接受的格式,请参阅 expire_fragment)。

# File actionpack/lib/abstract_controller/caching/fragments.rb, line 80
def write_fragment(key, content, options = nil)
  return content unless cache_configured?

  key = combined_fragment_cache_key(key)
  instrument_fragment_cache :write_fragment, key do
    content = content.to_str
    cache_store.write(key, content, options)
  end
  content
end