NoMethodError: BigDecimal类没有定义`new'方法

5

最近我已经更新了Ruby(从2.5.3到2.7.1)Ruby on Rails(从5.2.2到6.1.1)版本。

之后,当我运行rspec时,出现了以下错误:

Failure/Error: require File.expand_path("../../config/environment", __FILE__)
NoMethodError:
  undefined method `new' for BigDecimal:Class
# ./config/application.rb:11:in `<top (required)>'
# ./config/environment.rb:2:in `<top (required)>'

在spec_helper.rb中出现了错误。 如何调试spec_helper的代码,代码如下:

require File.expand_path("../../config/environment", __FILE__)

如何解决上述错误?我不确定是哪个 gem 或文件尝试执行 BigDecimal.new

1
这里有一个快速的教训,如果更新出了问题,你可以尝试逐个更新以找到问题的真正来源。我不知道你可能已经更新了100个不同的库,并且一次跳过了多个版本。尝试仅更新just-ruby到2.6。然后尝试将just-ruby更新到2.7。然后尝试将just-rails更新到6.0....等等。 - Tom Lord
你能在这里分享你的Gemfile吗? - Bijendra
2个回答

7

正如评论中@Tom Lord所建议的那样,将shoulda matcher更新到3.1.3版本对我有用。


0

需要 config/environment.rb 只是加载 Rails 和您的应用程序。很可能您的某个依赖项与 Ruby 2.6 不兼容(对于此确切错误,BigDecimal.new,在这里有解释 in this answer here,但不能保证它是唯一的),Rails 默认会从回溯中过滤掉 gem。

要调试此问题,您需要未经过滤的错误跟踪。为了获得它,您可以使用 rescue 包装 Bundler.require(*Rails.groups)Application.initialize!(最可能的错误将在初始化器中),并直接从异常获取回溯。

另一种方法是升级 bundle outdated 报告的所有内容,因为您已经冒着跳过多个 Rails 版本的风险,并希望所有使用的 gem 已经发布了兼容版本。

PS.通常不建议在升级期间跳过小的 Rails 和 Ruby 版本,因为这样您可能会跳过一些重要的弃用信息并获得意外行为。


感谢您的关注。实际上,我已经使用了next_rails gem,并检查了每个gem与6.1的兼容性,我能够运行rails服务器和控制台,但是当我使用RSpec命令运行任何单元测试用例时,我会遇到这个错误。 - Vishal
在将代码包装在begin-rescue中后,它仍然给我相同的错误,即:BigDecimal:Class没有定义“new”方法。 - Vishal
1
@Vishal,你对错误的回溯很感兴趣。如果错误不在“开发”环境中发生,那么可能是“测试”组中的一些宝石。不兼容性不是与Rails有关,而是与Ruby有关。 - Vasfed
BigDecimal.new在Ruby 2.6中已被弃用,因此另一个建议是使用Ruby 2.6运行应用程序(是的,这意味着您需要不幸地安装所有库...),并查找嘈杂的弃用警告的源代码。 - Tom Lord
3
一个“猜测”——而且这只是一个完全的猜测——是你需要更新shoulda-matchers gem版本3.1.3或更高版本 - Tom Lord
@TomLord 更新 shoulda 匹配器成功了!!!非常感谢。 - Vishal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接