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

当我想创build一个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 

出了什么问题? 我该如何解决它?

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

如果你不能升级到Ruby on Rails 2.3.11(并且扩展了douglasr的答案),那么必须在boot.rb的顶部需要thread 。 例如:

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

我能够通过将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 

您也可以通过在您的应用程序中要求“线程”来解决此问题:

 require 'thread' 

根据RubyGems 1.6.0 发行说明 。

如果你想保持你的版本相同的轨道将是2.3.8和gem版本将是最新的。 你可以使用这个解决scheme最新的Rails2.x的gem 。 在这个boot.rb文件和environment.rb文件的一些变化。

require 'thread在顶部boot.rb文件中的require 'thread ”。

并在environment.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 

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

 sudo gem update --system 1.4.2 

如果您使用Radiant CMS,只需添加

 require 'thread' 

config/boot.rb的顶部。

(对Aaron和nathanvda的回应表示敬意。)

正如前面提到的,在Ruby on Rails版本3以前版本中使用RubyGems 1.6.0时,会发生这种情况。我的应用程序使用的是Ruby on Rails 2.3.3,该版本已发布到项目的/ vendor中。

毫无疑问,Ruby on Rails升级到更新的2.3.X版本也可能解决这个问题。 但是,这个问题会阻止你运行Rake来代替Ruby on Rails并升级它。

在environment.rb的顶部添加require'thread'并没有解决我的问题。 向/vendor/rails/activesupport/lib/active_support.rb添加require'线程'确实解决了这个问题。

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

 gem install rails --version 3.0.5 

或v2.3.11:

 gem install rails --version 2.3.11 

如果这不是一个新的项目,你将不得不相应地升级你的应用程序。 如果这是一个新项目,只要删除它创build的目录并再次创build一个新的项目。

更新rubygems

gem更新 – 系统

我发布我的解决scheme,为其他睡眠剥夺的灵魂在那里:

如果您使用的是RVM,请仔细检查您是否在正确的文件夹中,使用正确的ruby版本和gemset。 我打开了一组terminal标签,其中一个标签位于不同的目录中。 键入“轨道控制台”产生的错误,因为我的默认轨道发行版是2.3.x.

我注意到我的错误,cd'd到正确的目录,其余的我的.rvmrc文件。

RVM不像Git。 在git中,更改一个shell中的分支可以随时随地更改它。 这是字面上重写有问题的文件。 另一方面,RVM只是设置shellvariables,并且必须为每个打开的新shell设置。

如果你不熟悉.rvmrc,你可以把一个名字的文件放在任何目录下,当你转到那个目录的时候,rvm会select它并使用指定的version / gemset。 这是一个示例.rvmrc文件:

 rvm use 1.9.2@turtles 

这将在您的RVM集合中使用gemset“turtles”切换到最新版本的ruby 1.9.2。 现在,你可以在terminal中打开一百个标签页(正如我最终所做的那样),不用担心它指向的ruby版本。