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

Posted

技术标签:

【中文标题】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) 【发布时间】:2021-11-15 08:02:38 【问题描述】:

当我将 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。第一个支持 Ruby 3.0 的 Rails 版本是 Rails 6.1。因此,您可能需要先更新 Rails 版本(或者如果您有一个简单的应用程序,则将其与 Ruby 版本一起更新)。 @Holger 一口气从 5.0 跳到 6 是一个非常大的冰雹玛丽。如果应用程序这么简单,重写会更容易。 guides.rubyonrails.org/upgrading_ruby_on_rails.html 【参考方案1】:

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 版本。

【讨论】:

我发现这个说 Rails 5.0 的最大 Ruby 版本小于 2.5。 fastruby.io/blog/ruby/rails/versions/compatibility-table.html @Chloe 听起来很有道理。 Heroku 仅支持 2.6.8。因此,在 Rails 更新之前,此应用程序将不再部署在 Heroku 上。 devcenter.heroku.com/articles/ruby-support#supported-runtimes 是的,这很不幸。不过,让您的应用程序升级到 Rails 5.2.x 应该没有那么困难。

以上是关于Rails 2.4 => 3.0:ActiveRecord:`add_modifier`:参数数量错误(给定 3,预期 2)(ArgumentError)的主要内容,如果未能解决你的问题,请参考以下文章

不同版本(2.3,2.4,2.5,3.0)的Servlet web.xml 头信息

Java Servlet 2.3/2.4/2.5/3.0/3.1/4.0 各web.xml文件

web.xml & web-fragment.xml (Servlet 2.3, 2.4, 2.5 + 3.0)模板

rails 3.0中的多个范围

Rails核心组件

Rails 3.0 中的 Arel 到底是啥?