Skip to content

Commit d8e6dc9

Browse files
committed
Fix rails#3737 AS::expand_cache_key generates wrong key in certain situations
`cache_key` method is never called when the argument is a 1-element array with something that responds to `cache_key`
1 parent a93ee92 commit d8e6dc9

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

activesupport/lib/active_support/cache.rb

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,10 @@ def self.expand_cache_key(key, namespace = nil)
8181
end
8282

8383
expanded_cache_key <<
84-
if key.respond_to?(:cache_key)
85-
key.cache_key
86-
elsif key.is_a?(Array)
87-
if key.size > 1
88-
key.collect { |element| expand_cache_key(element) }.to_param
89-
else
90-
key.first.to_param
91-
end
92-
elsif key
93-
key.to_param
84+
case
85+
when key.respond_to?(:cache_key) then key.cache_key
86+
when key.is_a?(Array) then key.map { |element| expand_cache_key(element) }.to_param
87+
when key then key.to_param
9488
end.to_s
9589

9690
expanded_cache_key

activesupport/test/caching_test.rb

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ def test_expand_cache_key_with_rails_cache_id
1212
begin
1313
ENV['RAILS_CACHE_ID'] = 'c99'
1414
assert_equal 'c99/foo', ActiveSupport::Cache.expand_cache_key(:foo)
15-
assert_equal 'c99/foo', ActiveSupport::Cache.expand_cache_key([:foo])
15+
assert_equal 'c99/c99/foo', ActiveSupport::Cache.expand_cache_key([:foo])
1616
assert_equal 'c99/c99/foo/c99/bar', ActiveSupport::Cache.expand_cache_key([:foo, :bar])
1717
assert_equal 'nm/c99/foo', ActiveSupport::Cache.expand_cache_key(:foo, :nm)
18-
assert_equal 'nm/c99/foo', ActiveSupport::Cache.expand_cache_key([:foo], :nm)
18+
assert_equal 'nm/c99/c99/foo', ActiveSupport::Cache.expand_cache_key([:foo], :nm)
1919
assert_equal 'nm/c99/c99/foo/c99/bar', ActiveSupport::Cache.expand_cache_key([:foo, :bar], :nm)
2020
ensure
2121
ENV['RAILS_CACHE_ID'] = nil
@@ -50,6 +50,14 @@ def key.cache_key
5050
assert_equal 'foo_key', ActiveSupport::Cache.expand_cache_key(key)
5151
end
5252

53+
def test_array_with_something_that_responds_to_cache_key
54+
key = 'foo'
55+
def key.cache_key
56+
:foo_key
57+
end
58+
assert_equal 'foo_key', ActiveSupport::Cache.expand_cache_key([key])
59+
end
60+
5361
end
5462

5563
class CacheStoreSettingTest < ActiveSupport::TestCase

0 commit comments

Comments
 (0)