【问题标题】:Rails NoMethodError: undefined method new for BigDecimal:ClassRails NoMethodError:BigDecimal 的未定义新方法:Class
【发布时间】:2020-05-30 06:52:42
【问题描述】:

我的应用程序已开启:

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

我发现了几个关于更新 bigdecimaloci8 gems 的帖子,所以尝试了几个版本,发现这些有帮助:git diff Gemfile

-gem 'ruby-oci8', '~> 2.1.5'
+gem 'ruby-oci8', '~> 2.2.8'

并添加了一个 bigdecimal gem:

+gem "bigdecimal", ">= 2.0.0"

现在当我运行我的 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>'

做更多的谷歌冲浪,我发现没有很多关于解决这个问题的信息。我确实看到了一些关于升级到最新版本的 rails 的提及。这是必须解决的吗?在我们准备好升级我们的 Rails 版本之前,是否有一个可以解决/修复/防止此问题的猴子补丁或修复程序?我觉得我们将永远追求最新版本的“胡萝卜棒”。

感谢您的任何建议。

【问题讨论】:

    标签: ruby-on-rails-4 bigdecimal oracle-call-interface


    【解决方案1】:

    根据the documentation of 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
    

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

    gem 'bigdecimal', '1.3.5'
    

    【讨论】:

    • 为了强调这一点,Rails 4 不能高于 Ruby 2.6,也不能高于 BigDecimal 1.4。
    • 记录一下:我能够使用 ruby​​ 2.7.5 运行 activerecord 4.2.11、bigdecimal 1.3.5
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多