Add explicit opt-out for fragment cache digesting
This add support for sending an explicit opt-out of the "Russian-doll" cache digest feature on a case-by-case basis. This is useful when cache- expiration needs to be performed manually and it would be otherwise difficult to know the exact name of a digested cache key. More information: https://github.com/rails/cache_digests/pull/16
This commit is contained in:
parent
0a7ba19dcc
commit
7fb8c67047
|
@ -52,6 +52,13 @@ module ActionView
|
|||
# Additionally, the digestor will automatically look through your template file for
|
||||
# explicit and implicit dependencies, and include those as part of the digest.
|
||||
#
|
||||
# The digestor can be bypassed by passing skip_digest: true as an option to the cache call:
|
||||
#
|
||||
# <% cache project, skip_digest: true do %>
|
||||
# <b>All the topics on this project</b>
|
||||
# <%= render project.topics %>
|
||||
# <% end %>
|
||||
#
|
||||
# ==== Implicit dependencies
|
||||
#
|
||||
# Most template dependencies can be derived from calls to render in the template itself.
|
||||
|
@ -105,7 +112,7 @@ module ActionView
|
|||
# Now all you'll have to do is change that timestamp when the helper method changes.
|
||||
def cache(name = {}, options = nil, &block)
|
||||
if controller.perform_caching
|
||||
safe_concat(fragment_for(fragment_name_with_digest(name), options, &block))
|
||||
safe_concat(fragment_for(cache_fragment_name(name, options), options, &block))
|
||||
else
|
||||
yield
|
||||
end
|
||||
|
@ -113,6 +120,21 @@ module ActionView
|
|||
nil
|
||||
end
|
||||
|
||||
# This helper returns the name of a cache key for a given fragment cache
|
||||
# call. By supplying skip_digest: true to cache, the digestion of cache
|
||||
# fragments can be manually bypassed. This is useful when cache fragments
|
||||
# cannot be manually expired unless you know the exact key which is the
|
||||
# case when using memcached.
|
||||
def cache_fragment_name(name = {}, options = nil)
|
||||
skip_digest = options && options.delete(:skip_digest)
|
||||
|
||||
if skip_digest
|
||||
name
|
||||
else
|
||||
fragment_name_with_digest(name)
|
||||
end
|
||||
end
|
||||
|
||||
def fragment_name_with_digest(name) #:nodoc:
|
||||
if @virtual_path
|
||||
[
|
||||
|
|
|
@ -164,6 +164,9 @@ class FunctionalCachingController < CachingController
|
|||
format.xml
|
||||
end
|
||||
end
|
||||
|
||||
def fragment_cached_without_digest
|
||||
end
|
||||
end
|
||||
|
||||
class FunctionalFragmentCachingTest < ActionController::TestCase
|
||||
|
@ -200,6 +203,15 @@ CACHED
|
|||
@store.read("views/test.host/functional_caching/html_fragment_cached_with_partial/#{template_digest("functional_caching/_partial", "html")}"))
|
||||
end
|
||||
|
||||
def test_skipping_fragment_cache_digesting
|
||||
get :fragment_cached_without_digest, :format => "html"
|
||||
assert_response :success
|
||||
expected_body = "<body>\n<p>ERB</p>\n</body>\n"
|
||||
|
||||
assert_equal expected_body, @response.body
|
||||
assert_equal "<p>ERB</p>", @store.read("views/nodigest")
|
||||
end
|
||||
|
||||
def test_render_inline_before_fragment_caching
|
||||
get :inline_fragment_cached
|
||||
assert_response :success
|
||||
|
|
3
actionpack/test/fixtures/functional_caching/fragment_cached_without_digest.html.erb
vendored
Normal file
3
actionpack/test/fixtures/functional_caching/fragment_cached_without_digest.html.erb
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
<body>
|
||||
<%= cache 'nodigest', skip_digest: true do %><p>ERB</p><% end %>
|
||||
</body>
|
Loading…
Reference in New Issue