Ruby 2.4和 Rails 4栈级别太深(SystemStackError)

我试图在 Rails 4.0.8中运行新创建的项目,但是我收到了错误消息:

    rails s
=> Booting WEBrick
=> Rails 4.0.8 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
/usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Fixnum is deprecated
/usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:121: warning: constant ::Bignum is deprecated
Exiting
/usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:124:in `block (2 levels) in <class:Numeric>': stack level too deep (SystemStackError)
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
from /usr/local/lib/ruby/gems/2.4.0/gems/activesupport-4.0.8/lib/active_support/core_ext/numeric/conversions.rb:131:in `block (2 levels) in <class:Numeric>'
... 5532 levels...
from /usr/local/lib/ruby/gems/2.4.0/gems/railties-4.0.8/lib/rails/commands.rb:71:in `tap'
from /usr/local/lib/ruby/gems/2.4.0/gems/railties-4.0.8/lib/rails/commands.rb:71:in `<top (required)>'
from bin/rails:4:in `require'
from bin/rails:4:in `<main>'

Ruby 版本:

Rails 4.0.8

我的 Gemefile:

source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.0.8'


# Use sqlite3 as the database for Active Record
gem 'sqlite3'


# Use SCSS for stylesheets
gem 'sass-rails', '~> 4.0.2'


# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'


# Use CoffeeScript for .js.coffee assets and views
gem 'coffee-rails', '~> 4.0.0'


# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby


# Use jquery as the JavaScript library
gem 'jquery-rails'


# Turbolinks makes following links in your web application faster. Read more: https://github.com/rails/turbolinks
gem 'turbolinks'


# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 1.2'
gem 'json', github: 'flori/json', branch: 'v1.8'
group :doc do
# bundle exec rake doc:rails generates the API under doc/api.
gem 'sdoc', require: false
end

我尝试重新安装 Rails,因为在我的机器上安装了5.0 Rails 之前。

当地宝石:

*** LOCAL GEMS ***


autoprefixer-rails (6.6.0)
coffee-rails (4.2.1, 4.0.1)
font-awesome-rails (4.7.0.1)
jquery-atwho-rails (1.3.2)
jquery-rails (4.2.2, 3.1.4)
rails (4.0.8, 4.0.0)
rails-dom-testing (2.0.2)
rails-html-sanitizer (1.0.3)
rails_12factor (0.0.3)
rails_serve_static_assets (0.0.5)
rails_stdout_logging (0.0.5)
sass-rails (5.0.6, 4.0.5)
sprockets-rails (3.2.0, 2.3.3, 2.0.1)

也许卸载: 红宝石和轨道将解决这个问题,但我不想这样做。基本上我想已经安装了两个版本的轨道,例如: 轨道4和轨道5以及。这种配置可行吗?

43168 次浏览

在 Ruby 2.4中,有一个整数类型的统一(即 FixnumBignum现在是完全相同的东西: Integer)。这导致了与现有 gems 的不兼容性,这些 gems 依赖于类的区别。

旧版本的 ActiveSupport 不喜欢这种统一,并且在尝试序列化数据时对它感到厌恶。因此,你有两个选择:

  • 你可以把 Ruby 降级到早于2.4的版本,比如 Ruby 2.3. x。
  • 或者您可以将 Rails 升级到更新的版本。最好是 Rails 5.x。在 Rails 4.2.8发布的4.2稳定分支中也有一个补丁,使其成为官方支持 Ruby 2.4的 Rails 4.2系列的第一个版本。早期的 Rails 版本与 Ruby 2.4不兼容。

关于这个错误,您正在运行刚刚发布的 Ruby 2.4,Rails 和 ActiveSupport (尤其是它们的旧版本)很可能还不支持它。

这个 Rails Guide 声明您的 Rails 版本(4.0.8)更喜欢 Ruby 2.0。

您可以通过升级您的 Rails 安装(gem 'rails', '5.0')或使用版本管理器(例如 $ rvm install 2.3.0; rvm use 2.3.0)降级到旧版本的 Ruby 来修复这个错误。

我有同样的错误,但我不想升级到5.0,我的应用程序是非常大和升级太多的时间。我正在升级 Rails 4.1.7Rails to 4.2.8的第一个 Rails 版本,支持 Ruby 2.4:

在 Gemfile:

gem 'rails', '4.2.8'

然后:

bundle update rails