未初始化的常量ActiveSupport::Dependencies::Mutex (NameError)

当我想创建一个Ruby on Rails项目时,我得到了下面的消息。

/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support/dependencies.rb:55: uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.8/lib/active_support.rb:57
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from /usr/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails_generator.rb:31
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
from /usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:36:in `require'
from /usr/lib/ruby/gems/1.8/gems/rails-2.3.8/bin/rails:15
from /usr/bin/rails:19:in `load'
from /usr/bin/rails:19

出了什么问题?我该怎么修呢?

115472 次浏览

这是Rails 2.3.8和RubyGems最新版本之间的不兼容性。升级到最新的2.3版本(截至今天为2.3.11)。

尝试将Ruby on Rails版本更新到v3.0.5:

gem install rails --version 3.0.5

或v2.3.11:

gem install rails --version 2.3.11

如果这不是一个新项目,您将不得不相应地升级您的应用程序。如果它是一个新项目,只需删除创建它的目录,然后重新创建一个新项目。

你也可以通过在你的应用程序中要求'thread'来解决这个问题:

require 'thread'

根据RubyGems 1.6.0 发布说明

如前所述,在Ruby on Rails版本3之前的版本中使用RubyGems 1.6.0时会出现这种情况。我的应用程序使用的是Ruby on Rails 2.3.3,该项目的/vendor提供了该版本。

毫无疑问,Ruby on Rails将升级到更新的2.3。X版本也可以修复此问题。然而,这个问题阻止你运行来解除Ruby on Rails的供应商并升级它。

将require 'thread'添加到环境的顶部。Rb没有帮我解决这个问题。添加require ` thread `到/vendor/rails/activesupport/lib/active_support。Rb确实解决了这个问题。

如果你不能升级到Ruby on Rails 2.3.11(扩展douglasr的回答),thread必须在boot.rb的顶部。例如:

require 'thread'


# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
...

如果你想保持你的版本相同,如rails将2.3.8和gem版本将是最新的。你可以使用这个解决方案Rails2.x的最新宝石。在这方面的一些变化在引导。Rb文件和环境。rb文件。

require 'thread `在引导。Rb文件在顶部。

还有环境。Rb文件在初始化块上方添加以下代码。

if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.3.7')
module Rails
class GemDependency
def requirement
r = super
(r == Gem::Requirement.default) ? nil : r
end
end
end
end

我可以通过将RubyGems降级到1.5.3来解决这个问题,因为它发生在RubyGems 1.6.0+和Rails <2.3.11:

gem update --system 1.5.3

如果你之前已经降级到更早的版本,想要更新到1.5.3,当你试图运行它时,你可能会得到以下结果:

Updating RubyGems
ERROR:  While executing gem ... (RuntimeError)
No gem names are allowed with the --system option

如果你得到这个错误,然后更新,这样你就可以指定版本,然后再次降级:

gem update --system
gem update --system 1.5.3

如果你使用辐射式CMS,只需添加

require 'thread'

config/boot.rb的顶部。

(Aaron和nathanvda的回答很赞。)

我把我的解决方案发给其他睡眠不足的人:

如果您正在使用RVM,请仔细检查您是否在正确的文件夹中,使用正确的ruby版本和gemset。我打开了一个终端选项卡数组,其中一个在不同的目录中。输入“rails控制台”产生错误,因为我的默认rails发行版是2.3.x。

我注意到我的错误,cd到正确的目录,我的.rvmrc文件完成了其余的工作。

RVM像Git一样是。在git中,在一个shell中改变分支会在所有地方改变它。它实际上是在重写相关文件。另一方面,RVM只是设置shell变量,并且必须为您打开的每个新shell设置。

如果您不熟悉.rvmrc,您可以将该名称的文件放在任何目录中,无论何时您更改到该目录,rvm都会选择它并使用其中指定的版本/gemset。下面是一个。rvmrc文件示例:

rvm use 1.9.2@turtles

这将切换到RVM集合中的最新版本ruby 1.9.2,使用gemset“turtles”。现在你可以在终端中打开100个选项卡(就像我最后做的那样),而不用担心它指向的ruby版本。

当我在使用rails 3>之后尝试启动一个旧的rails 2.3.5项目时,我在很多情况下都遇到过这个问题。在我的情况下,要解决这个问题,我必须做一个rubygems更新到1.4.2版本,这是:

sudo gem update --system 1.4.2

更新rubygems

Gem更新——system