升级Ruby至2.6.10后sudo版本不一致及SystemStackError解决咨询
Ruby版本差异与Rails启动错误解决方案
一、sudo与非sudo调用Ruby版本不同的原因
- rbenv是用户级别的Ruby版本管理工具,默认仅对当前登录用户生效。执行
sudo时会切换到root用户环境,而root用户未配置rbenv,因此调用的是系统默认安装的Ruby 2.1.5,而非你通过rbenv安装的2.6.10。 - 即使使用
sudo -E保留当前用户环境变量,root用户的PATH可能未包含rbenv的可执行文件路径,导致优先调用系统Ruby。 bundler版本不一致同理:你安装的bundler-2.3.23属于当前用户的gem包,root用户使用的是系统Ruby对应的bundler-1.17.2。
二、SystemStackError的解决方法
该错误是Rails 4.1.8与Ruby 2.6.x版本不兼容导致的:Ruby 2.6将Fixnum和Bignum合并为Integer,而Rails 4.1.8的activesupport扩展仍在使用这两个已废弃的常量,触发无限递归调用,最终抛出stack level too deep错误。
可通过以下三种方式解决:
1. 降级Ruby到兼容版本
Rails 4.1.x官方支持的最高Ruby版本是2.3.x,通过rbenv安装该分支的稳定版:
rbenv install 2.3.8 rbenv local 2.3.8 bundle install
完成后重新启动Rails服务即可。
2. 升级Rails到兼容版本
将Rails升级到4.2.x分支(该分支支持Ruby 2.6.x):
- 修改项目根目录
Gemfile,将gem 'rails', '4.1.8'改为gem 'rails', '~> 4.2.11' - 执行更新命令:
bundle update rails bundle install
升级后启动服务即可解决兼容性问题。
3. 手动修复activesupport代码
若暂时不想修改Ruby或Rails版本,可直接修改报错文件:
打开/home/ubuntu/.rbenv/versions/2.6.10/lib/ruby/gems/2.6.0/gems/activesupport-4.1.8/lib/active_support/core_ext/numeric/conversions.rb,找到以下代码块:
[Numeric, Fixnum, Bignum].each do |klass| klass.class_eval do # ... 原有代码 end end
将Fixnum和Bignum替换为Integer,修改后为:
[Numeric, Integer].each do |klass| klass.class_eval do # ... 原有代码 end end
保存后重新启动Rails服务即可。
内容的提问来源于stack exchange,提问作者Katelynn ruan
相关产品推荐
相关产品推荐

