diff --git a/activemodel/lib/active_model/attribute_methods.rb b/activemodel/lib/active_model/attribute_methods.rb index 1a4e0b8e59..ee7833ea34 100644 --- a/activemodel/lib/active_model/attribute_methods.rb +++ b/activemodel/lib/active_model/attribute_methods.rb @@ -360,13 +360,14 @@ def attribute_method_matchers_matching(method_name) # using the given `extra` args. This falls back on `define_method` # and `send` if the given names cannot be compiled. def define_proxy_call(include_private, mod, name, target, *extra) + kw = RUBY_VERSION >= '2.7' ? ", **options" : nil defn = if NAME_COMPILABLE_REGEXP.match?(name) - "def #{name}(*args)" + "def #{name}(*args#{kw})" else - "define_method(:'#{name}') do |*args|" + "define_method(:'#{name}') do |*args#{kw}|" end - extra = (extra.map!(&:inspect) << "*args").join(", ") + extra = (extra.map!(&:inspect) << "*args#{kw}").join(", ") body = if CALL_COMPILABLE_REGEXP.match?(target) "#{"self." unless include_private}#{target}(#{extra})"