首页 > 解决方案 > Rails 2.4 => 3.0:ActiveRecord:`add_modifier`:参数数量错误(给定 3,预期 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

标签: ruby-on-railsrubyrails-activerecord

解决方案


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

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

Ruby 3.0 有一些重大变化。尤其是关键字参数与位置参数的分离,这是您遇到错误的最可能原因。

在以前的 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

您需要找到不同的升级路径,在将项目升级到新版本的 Rails 时逐步升级 Ruby 版本。


推荐阅读