ActiveSupport Gem弃用警告及Rails控制台栈溢出问题求助
解决Rails 4.2.6 + Ruby 2.4.1启动控制台时的栈溢出错误
你遇到的这个问题本质是Ruby 2.4.x和Rails 4.2.6的版本兼容性冲突,具体原因和解决方案如下:
问题根源
Ruby 2.4.0开始移除了Fixnum和Bignum这两个常量,统一合并成了Integer。但Rails 4.2.6的activesupport组件里的numeric/conversions.rb文件仍然依赖这两个废弃的常量,在初始化时触发了无限递归调用,最终导致stack level too deep (SystemStackError)错误——那些重复的block (2 levels) in <class:Numeric>就是递归的直接表现。
可行的解决方案
方案1:升级Rails到兼容版本(推荐)
Rails官方在4.2.11版本修复了对Ruby 2.4+的兼容问题,这是最稳妥的解决方式:
- 打开项目根目录的
Gemfile,把gem 'rails', '4.2.6'修改为gem 'rails', '~> 4.2.11' - 运行命令
bundle update rails更新依赖 - 之后再尝试启动控制台:
rails c
方案2:添加初始化补丁(临时应急)
如果暂时无法升级Rails,可以通过添加初始化补丁来绕过递归问题:
- 在项目的
config/initializers目录下新建一个文件,比如fix_numeric_recursion.rb - 把以下代码粘贴进去:
class Numeric def to_formatted_string(format = nil, options = {}) return to_s if format.nil? case format.to_sym when :db if respond_to?(:in_time_zone) in_time_zone.to_s(:db) else to_s end else to_s end end alias_method :to_fs, :to_formatted_string end - 保存后重新启动控制台,这个补丁会覆盖掉原有的有问题的方法,避免无限递归。
方案3:降级Ruby版本(不推荐)
如果以上两种方式都无法实施,可以考虑把Ruby版本降级到2.3.x(比如2.3.8),因为Ruby 2.3还保留了Fixnum和Bignum常量,能和Rails 4.2.6正常兼容。不过注意Ruby 2.3已经停止安全维护,长期来看存在安全风险。
另外你提到已经停止了Spring服务,这个问题和Spring无关,所以停不停Spring都不会影响这个报错的出现~
内容的提问来源于stack exchange,提问作者user7386116
相关产品推荐
相关产品推荐

