提交 6ed4ad13 编写于 作者: R Rafael Mendonça França

Merge pull request #8371 from freegenie/5396-conditional-fragment-caching

Allow fragment cache to accept :if and :unless options.

Closes #5396
## Rails 4.0.0 (unreleased) ## ## Rails 4.0.0 (unreleased) ##
* Add :if / :unless conditions to fragment cache:
<%= cache @model, if: some_condition(@model) do %>
*Stephen Ausman + Fabrizio Regini*
* Add filter capability to ActionController logs for redirect locations: * Add filter capability to ActionController logs for redirect locations:
config.filter_redirect << 'http://please.hide.it/' config.filter_redirect << 'http://please.hide.it/'
......
...@@ -110,8 +110,15 @@ module CacheHelper ...@@ -110,8 +110,15 @@ module CacheHelper
# <%= some_helper_method(person) %> # <%= some_helper_method(person) %>
# #
# Now all you'll have to do is change that timestamp when the helper method changes. # Now all you'll have to do is change that timestamp when the helper method changes.
#
# ==== Conditional caching
#
# You can pass :if and :unless options, to conditionally perform or skip the cache.
#
# <%= cache @model, if: some_condition(@model) do %>
#
def cache(name = {}, options = nil, &block) def cache(name = {}, options = nil, &block)
if controller.perform_caching if controller.perform_caching && conditions_match?(options)
safe_concat(fragment_for(cache_fragment_name(name, options), options, &block)) safe_concat(fragment_for(cache_fragment_name(name, options), options, &block))
else else
yield yield
...@@ -136,6 +143,11 @@ def cache_fragment_name(name = {}, options = nil) ...@@ -136,6 +143,11 @@ def cache_fragment_name(name = {}, options = nil)
end end
private private
def conditions_match?(options)
!(options && (!options.fetch(:if, true) || options.fetch(:unless, false)))
end
def fragment_name_with_digest(name) #:nodoc: def fragment_name_with_digest(name) #:nodoc:
if @virtual_path if @virtual_path
[ [
......
...@@ -46,6 +46,22 @@ def with_fragment_cache_and_percent_in_key ...@@ -46,6 +46,22 @@ def with_fragment_cache_and_percent_in_key
render :inline => "<%= cache('foo%bar'){ 'Contains % sign in key' } %>" render :inline => "<%= cache('foo%bar'){ 'Contains % sign in key' } %>"
end end
def with_fragment_cache_and_if_true_condition
render :inline => "<%= cache('foo', :if => true) { 'bar' } %>"
end
def with_fragment_cache_and_if_false_condition
render :inline => "<%= cache('foo', :if => false) { 'bar' } %>"
end
def with_fragment_cache_and_unless_false_condition
render :inline => "<%= cache('foo', :unless => false) { 'bar' } %>"
end
def with_fragment_cache_and_unless_true_condition
render :inline => "<%= cache('foo', :unless => true) { 'bar' } %>"
end
def with_exception def with_exception
raise Exception raise Exception
end end
...@@ -203,6 +219,54 @@ def test_with_fragment_cache ...@@ -203,6 +219,54 @@ def test_with_fragment_cache
@controller.config.perform_caching = true @controller.config.perform_caching = true
end end
def test_with_fragment_cache_and_if_true
@controller.config.perform_caching = true
get :with_fragment_cache_and_if_true_condition
wait
assert_equal 4, logs.size
assert_match(/Read fragment views\/foo/, logs[1])
assert_match(/Write fragment views\/foo/, logs[2])
ensure
@controller.config.perform_caching = true
end
def test_with_fragment_cache_and_if_false
@controller.config.perform_caching = true
get :with_fragment_cache_and_if_false_condition
wait
assert_equal 2, logs.size
assert_no_match(/Read fragment views\/foo/, logs[1])
assert_no_match(/Write fragment views\/foo/, logs[2])
ensure
@controller.config.perform_caching = true
end
def test_with_fragment_cache_and_unless_true
@controller.config.perform_caching = true
get :with_fragment_cache_and_unless_true_condition
wait
assert_equal 2, logs.size
assert_no_match(/Read fragment views\/foo/, logs[1])
assert_no_match(/Write fragment views\/foo/, logs[2])
ensure
@controller.config.perform_caching = true
end
def test_with_fragment_cache_and_unless_false
@controller.config.perform_caching = true
get :with_fragment_cache_and_unless_false_condition
wait
assert_equal 4, logs.size
assert_match(/Read fragment views\/foo/, logs[1])
assert_match(/Write fragment views\/foo/, logs[2])
ensure
@controller.config.perform_caching = true
end
def test_with_fragment_cache_and_percent_in_key def test_with_fragment_cache_and_percent_in_key
@controller.config.perform_caching = true @controller.config.perform_caching = true
get :with_fragment_cache_and_percent_in_key get :with_fragment_cache_and_percent_in_key
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册