Rails NoMethodError:BigDecimal:Class 的未定义新方法

Joh*_*wan 23 oracle-call-interface bigdecimal ruby-on-rails-4

我的应用程序在:

ruby-2.6.4 Rails 4.2.8 activerecord-4.2.8

我升级Rails应用程序,以ruby-2.6.4 当运行在开发rake任务,进行测试,我对收到错误BigDecimal().../vendor/bundle/ruby/2.6.0/gems/ruby-oci8/...

ArgumentError: invalid value for BigDecimal(): "0.E+00"
/sha/git/sha_human_resources/shared/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/bindtype.rb:35:in `BigDecimal'
...
.../vendor/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/bindtype.rb:216: warning: constant ::Fixnum is deprecated
.../vendor/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/bindtype.rb:219: warning: constant ::Bignum is deprecated
.../vendor/bundle/ruby/2.6.0/gems/ruby-oci8-2.1.8/lib/oci8/compat.rb:73: warning: constant ::Fixnum is deprecated
Run Code Online (Sandbox Code Playgroud)

我找到了几个关于更新bigdecimaloci8gems 的线程,所以尝试了几个版本,发现这些有帮助git diff Gemfile::

-gem 'ruby-oci8', '~> 2.1.5'
+gem 'ruby-oci8', '~> 2.2.8'
Run Code Online (Sandbox Code Playgroud)

并添加了一个 bigdecimal gem:

+gem "bigdecimal", ">= 2.0.0"
Run Code Online (Sandbox Code Playgroud)

现在,当我运行 rake 任务时,出现此错误:

rake aborted!
NoMethodError: undefined method `new' for BigDecimal:Class
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object/duplicable.rb:111:in `<class:BigDecimal>'
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object/duplicable.rb:106:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object.rb:3:in `require'
.../vendor/bundle/ruby/2.6.0/gems/activesupport-4.2.8/lib/active_support/core_ext/object.rb:3:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/configuration.rb:2:in `require'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/configuration.rb:2:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/railtie.rb:2:in `require'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/railtie.rb:2:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/engine.rb:1:in `require'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/engine.rb:1:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/application.rb:7:in `require'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/application.rb:7:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails.rb:11:in `require'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails.rb:11:in `<top (required)>'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/all.rb:1:in `require'
.../vendor/bundle/ruby/2.6.0/gems/railties-4.2.8/lib/rails/all.rb:1:in `<top (required)>'
.../config/application.rb:3:in `require'
.../config/application.rb:3:in `<top (required)>'
.../Rakefile:6:in `require'
.../Rakefile:6:in `<top (required)>'
/usr/local/rvm/rubies/ruby-2.6.4/bin/bundle:30:in `block in <main>'
/usr/local/rvm/rubies/ruby-2.6.4/bin/bundle:22:in `<main>'
/usr/local/rvm/gems/ruby-2.6.4/bin/ruby_executable_hooks:24:in `eval'
/usr/local/rvm/gems/ruby-2.6.4/bin/ruby_executable_hooks:24:in `<main>'
Run Code Online (Sandbox Code Playgroud)

做更多的谷歌冲浪,我发现解决这个问题的信息并不多。我确实看到有人提到升级到最新版本的 rails。这是必须解决这个问题吗?在我们准备好升级我们的 rails 版本之前,是否有可以解决/修复/防止这种情况的monkeypatch 或修复程序?我觉得我们将永远追逐最新版本的 rails。

感谢您的任何建议。

小智 40

根据BigDecimal 的文档,对于所有 Ruby 版本 2.6.x,您应该使用具有特定版本的 BigDecimal:

版本之间的差异如下:

version  characteristics                                            Supported ruby version range
2.0.0    You cannot use BigDecimal.new and do subclassing           2.4 ..
1.4.x    BigDecimal.new and subclassing always prints warning.      2.3 .. 2.6
1.3.5    You can use BigDecimal.new and subclassing without warning .. 2.5
Run Code Online (Sandbox Code Playgroud)

您可以使用gemGemfile 或脚本中的方法选择要使用的版本。例如,你想坚持 bigdecimal 版本 1.3.5,它工作文件将以下gem调用放入你的 Gemfile 中。

gem 'bigdecimal', '1.3.5'
Run Code Online (Sandbox Code Playgroud)

  • 为了强调这一点,Rails 4 不能高于 Ruby 2.6,也不能高于 BigDecimal 1.4。 (17认同)
  • 作为记录:我能够使用 ruby​​ 2.7.5 运行 activerecord 4.2.11, bigdecimal 1.3.5 (7认同)
  • 也作为记录,从 Ruby 2.5.1 更新到 Ruby 2.7.2,我修复了它,添加了 Shoulda-matchers 4.5.1、bigdecimal 1.3.5 和 activerecord 4.2.11 (2认同)