Rails 2.4 => 3.0:ActiveRecord:`add_modifier`:参数数量错误(给定 3,预期 2)(ArgumentError)

Rails 2.4 => 3.0: ActiveRecord: `add_modifier`: wrong number of arguments (given 3, expected 2) (ArgumentError)

当我将 Ruby 版本从 2.4.3 更新到 3.0.2 时,(bundle update),并尝试 运行 Rails 控制台,我得到这个错误信息。我该如何解决?

C:\Users\Chloe\workspace\catalyst_research>rails console
C:/ruby30/lib/ruby/gems/3.0.0/gems/activerecord-5.0.7.2/lib/active_record/type/adapter_specific_registry.rb:7:in `add_modifier': wrong number of arguments (given 3, expected 2) (ArgumentError)
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/activerecord-5.0.7.2/lib/active_record/type.rb:22:in `add_modifier'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/postgresql_adapter.rb:827:in `<class:PostgreSQLAdapter>'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/postgresql_adapter.rb:69:in `<module:ConnectionAdapters>'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/postgresql_adapter.rb:41:in `<module:ActiveRecord>'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/activerecord-5.0.7.2/lib/active_record/connection_adapters/postgresql_adapter.rb:19:in `<main>'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/bootsnap-1.9.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require'
        from C:/ruby30/lib/ruby/gems/3.0.0/gems/activesupport-5.0.7.2/lib/active_support/dependencies.rb:293:in `block in require'
...
C:/Users/Chloe/workspace/catalyst_research/config/environment.rb:5:in
...

Gemfile:

ruby '~>2.4.1'#'~>3.0.2'
gem 'rails', '~> 5.0.2'
...

environment.rb:5:

Rails.application.initialize!

adapter_specific_registry.rb:7:

  6     class AdapterSpecificRegistry < ActiveModel::Type::Registry
  7       def add_modifier(options, klass, **args)
  8         registrations << DecorationRegistration.new(options, klass, **args)
  9       end

Rails 5.0.X 与 Ruby 3.0 不兼容 - 期间。这不会改变,因为它不再维护。

Rails 6.0.2 是与 Ruby 3.0 兼容的最早 Rails 版本。

Ruby 3.0 有一些重大变化。尤其是 separation of keyword arguments from positional arguments,它最有可能导致您收到错误。

在以前的 Ruby 版本中,您可以将方法调用为:

add_modifier({ foo: 1 }, klass, { bar : 1 })

和 Ruby 会自动将最后一个位置参数转换为关键字参数。这已被弃用,并将在 Ruby 2.7 中发出警告,并在 Ruby 3.0 中被完全删除。你得到(给定 3,预期 2),因为最后一个参数被视为位置参数。

如果你想在 Ruby 3 中将散列作为关键字参数传递,你需要使用双 splat 来转换它:

add_modifier({ foo: 1 }, klass, **{ bar : 1 })

TLDR

您需要找到一个不同的 upgrade path,在将项目升级到 Rails 的较新版本时,您可以在其中逐步升级 Ruby 版本。