From f002be148e1377709ed28b8e80c5db76ee2fa410 Mon Sep 17 00:00:00 2001 From: Matt Tanous Date: Wed, 25 Jul 2018 17:04:34 -0400 Subject: Add :allow_nil option to delegate_missing_to; use in ActiveStorage attachment --- .../lib/active_support/core_ext/module/delegation.rb | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'activesupport/lib') diff --git a/activesupport/lib/active_support/core_ext/module/delegation.rb b/activesupport/lib/active_support/core_ext/module/delegation.rb index 9fe7f8fe01..2f88010d27 100644 --- a/activesupport/lib/active_support/core_ext/module/delegation.rb +++ b/activesupport/lib/active_support/core_ext/module/delegation.rb @@ -274,8 +274,9 @@ class Module # variables, methods, constants, etc. # # The delegated method must be public on the target, otherwise it will - # raise +NoMethodError+. - def delegate_missing_to(target) + # raise +DelegationError+. If you wish to instead return +nil+, + # use the :allow_nil option. + def delegate_missing_to(target, allow_nil: nil) target = target.to_s target = "self.#{target}" if DELEGATION_RESERVED_METHOD_NAMES.include?(target) @@ -295,7 +296,11 @@ class Module super rescue NoMethodError if #{target}.nil? - raise DelegationError, "\#{method} delegated to #{target}, but #{target} is nil" + if #{allow_nil == true} + return nil + else + raise DelegationError, "\#{method} delegated to #{target}, but #{target} is nil" + end else raise end -- cgit v1.2.3