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

时间:2011-03-03 04:50:05

标签: ruby-on-rails rubygems compatibility

当我想创建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

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

11 个答案:

答案 0 :(得分:211)

如果您无法升级到Ruby on Rails 2.3.11(并扩展douglasr的答案),thread顶部必须{}} {}。例如:

boot.rb

答案 1 :(得分:158)

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

答案 2 :(得分:137)

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

答案 3 :(得分:35)

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

require 'thread'

根据RubyGems 1.6.0 release notes

答案 4 :(得分:24)

如果你想保持你的版本相同,像rails将是2.3.8,宝石版本将是最新的。您可以使用此解决方案Latest gem with Rails2.x。在boot.rb文件和environment.rb文件中进行了一些更改。

位于顶部的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

答案 5 :(得分:11)

我在使用rails 3>工作后尝试启动旧的rails 2.3.5项目时,在许多场合遇到了这个问题。在我解决问题的情况下,我必须对版本1.4.2进行rubygems更新,这是:

sudo gem update --system 1.4.2

答案 6 :(得分:6)

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

即可
require 'thread'

config/boot.rb的顶部。

(感谢Aaron和nathanvda的回应。)

答案 7 :(得分:3)

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

gem install rails --version 3.0.5

或v2.3.11:

gem install rails --version 2.3.11

如果这不是新项目,则必须相应地升级您的应用程序。如果它是一个新项目,只需删除您在其中创建的目录并再次创建一个新项目。

答案 8 :(得分:3)

如上所述,当使用RubyGems 1.6.0和版本3之前的Ruby on Rails版本时会发生这种情况。我的应用程序使用Ruby on Rails 2.3.3销售到项目的/供应商。

毫无疑问,将Ruby on Rails升级到更新的2.3.X版本也可以解决这个问题。但是,此问题会阻止您运行Rake以展开Ruby on Rails并升级它。

在环境的顶部添加require'trread'.rb并没有为我解决问题。向/vendor/rails/activesupport/lib/active_support.rb添加require'trread'确实解决了这个问题。

答案 9 :(得分:1)

更新rubygems

gem update --system

答案 10 :(得分:-1)

我正在为其他睡眠不足的灵魂发布我的解决方案:

如果您正在使用RVM,请使用正确的ruby版本和gemset仔细检查您是否在正确的文件夹中。我打开了一系列终端选项卡,其中一个位于不同的目录中。键入“rails console”会产生错误,因为我的默认rails distro是2.3.x。

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

RVM 不像Git那样。在git中,在一个shell中更改分支会在任何地方更改它。它实际上是重写有问题的文件。另一方面,RVM只是设置shell变量,必须为你打开的每个新shell设置。

如果您不熟悉.rvmrc,可以将具有该名称的文件放在任何目录中,只要您更改到该目录,rvm就会将其选中并使用其中指定的版本/ gemset。这是一个示例.rvmrc文件:

rvm use 1.9.2@turtles

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