【问题标题】:Ruby 2.4 and Rails 4 stack level too deep (SystemStackError)Ruby 2.4 和 Rails 4 堆栈级别太深 (SystemStackError)
【发布时间】:2017-05-21 02:55:48
【问题描述】:

我正在尝试在 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)

Meybe unistall:ruby 和 rails 会解决这个问题,但我不想这样做。 Beasically 我想安装两个版本的导轨,例如:导轨 4 和导轨 5。这种配置可行吗?

【问题讨论】:

  • 您使用任何 ruby​​ 版本管理器吗?喜欢rvm?您可以配置不同的 gemset。每个 gemset 都由 ruby​​ 和 rails 版本组成。这意味着您可以定义 ruby​​ 和 rails 版本的不同组合。在不同的开发环境中在 gemset 之间切换。
  • 这似乎在 Rails 4.2 中得到修复。见这里:github.com/rails/rails/pull/25161

标签: ruby-on-rails ruby


【解决方案1】:

在 Ruby 2.4 中,统一了整数类型(即 FixnumBignum 现在是相同的东西:Integer)。这导致与依赖于类的区别的现有 gem 存在相当多的不兼容。

旧版本的 ActiveSupport 不喜欢这种统一,并且在尝试序列化数据时会反对它。因此,您有以下两种选择之一:

  • 您可以将 Ruby 降级到 2.4 之前的版本,例如Ruby 2.3.x。
  • 或者您可以将 Rails 升级到更新的版本。最好是 Rails 5.x。 4.2-stable 分支中还有一个补丁,它与Rails 4.2.8 一起发布,使其成为Rails 4.2 系列的第一个正式支持Ruby 2.4 的版本。早期的 Rails 版本与 Ruby 2.4 不兼容。

【讨论】:

    【解决方案2】:

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

    This Rails 指南指出您的 Rails 版本 (4.0.8) 更喜欢 Ruby 2.0。

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

    【讨论】:

    • 我使用了gem 'rails', '5.0',还需要我使用bundle update 将activerecord 更新到5.0.0。
    【解决方案3】:

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

    在 Gemfile 中:

    gem 'rails', '4.2.8'
    

    然后:

    bundle update rails
    

    【讨论】:

    • 这救了我!工作过bundle update rails,之前我尝试过使用bundle install
    猜你喜欢
    • 2013-10-05
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 2016-09-10
    • 2014-10-25
    相关资源
    最近更新 更多