ruby-on-rails - 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
解决方案
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 版本。
推荐阅读
- azure - 如果满足记录的某些条件,如何在 Azure 中创建服务来监控数据库?
- dataframe - 将 3 级嵌套字典键值转换为 pyspark 数据帧
- reactjs - 无法在平面列表中呈现功能图标 - React Native
- r - 使用 R 软件创建 n x n 矩阵,主对角线为 1,公共值在其他单元格中为 0.012
- reactjs - create-react-app service worker 可以帮助告诉用户应用程序在页面重新加载之前已经更新吗?
- python - 将变量分配为键名ordereddict
- django - 更改 Django 身份验证表单中的登录标签
- javascript - 将一个数组的元素推入不同类型的数组,同时附加其他元素(Javascript/Typescript)
- javascript - 尝试更新 mongo 数据中的数组
- arrays - 如何转换数组
排列 使用 Pyspark?