diff --git a/activesupport/CHANGELOG.md b/activesupport/CHANGELOG.md index fb9f5a447c5b6d89deb4cc16bdb88ce4ae39f7f6..aefc94e0d9f98e32bdd2b6eb504b2655e9a1806b 100644 --- a/activesupport/CHANGELOG.md +++ b/activesupport/CHANGELOG.md @@ -1,3 +1,8 @@ +* Fixed a bug that `ArrayInquirer#respond_to_missing?` does not fallback to + `Array#respond_to_missing?`. + + *Akira Matsuda* + * Fix inconsistent results when parsing large durations and constructing durations from code ActiveSupport::Duration.parse('P3Y') == 3.years # It should be true diff --git a/activesupport/lib/active_support/array_inquirer.rb b/activesupport/lib/active_support/array_inquirer.rb index 85122e39b209479ede460eacfe9ff59e44b8ae4d..d364996e0bd546af4506be04f83b3e5e4d446981 100644 --- a/activesupport/lib/active_support/array_inquirer.rb +++ b/activesupport/lib/active_support/array_inquirer.rb @@ -32,7 +32,7 @@ def any?(*candidates, &block) private def respond_to_missing?(name, include_private = false) - name[-1] == "?" + (name[-1] == "?") || super end def method_missing(name, *args) diff --git a/activesupport/test/array_inquirer_test.rb b/activesupport/test/array_inquirer_test.rb index 4d3f5b001ce8876f91c974e11d594838eefb9613..3ed48dd49de282ec4e7bdeb2c7811a2d249999f9 100644 --- a/activesupport/test/array_inquirer_test.rb +++ b/activesupport/test/array_inquirer_test.rb @@ -38,4 +38,18 @@ def test_inquiry assert_instance_of ActiveSupport::ArrayInquirer, result assert_equal @array_inquirer, result end + + def test_respond_to_fallback_to_array_respond_to + arr = ActiveSupport::ArrayInquirer.new([:x]) + # This kind of emulates a situation that Array#respond_to_missing? is defined + arr.singleton_class.class_eval do + def respond_to_missing?(name, _include_private = false) + (name == :foo) || super + end + end + + assert_respond_to arr, :can_you_hear_me? + assert_respond_to arr, :foo + assert_not_respond_to arr, :nope + end end