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

238

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

出了什么问题?我该怎么修复它?


你能发布一下 gem --version 的输出吗? - Andrew Marshall
11个回答

213

如果您无法升级到 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
...

28
boot.rb文件的顶部添加它甚至更加容易。 - nathanvda
12
将其添加到boot.rb中实际上应该是正确的答案。 - radiospiel
1
我该如何添加所需的线程?在哪个文件中?我的意思是,还没有创建Rails项目。这是核心代码的更改吗? - alfizqu
@alfizqu,该文件位于<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb - JellicleCat
我已将它添加到 config/boot.rb 文件中,但对我没有起作用。我应该在哪里添加它? - Amrit Dhungana

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
在安装了 Rails 3 和 Rubygems 1.6+ 后,运行一个 2.3.5 版本的 Rails 应用程序出现了问题。通过这种方式解决了问题,谢谢。 - RoR
4
对我来说它无法工作... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30> - Ray301
4
@aaron,你编辑了我的答案,在命令前面加上sudo,但据我所知,sudo并不总是适用的(比如在使用rvm时等情况)。人们可以根据需要添加它。 - Gary S. Weaver
5
如果您正在使用rvm(在需要返回并支持旧代码库时非常理惠!),则可以执行以下操作:rvm rubygems 1.5.3 - tardate
@Ray301 我也遇到了同样的问题。http://excid3.com/blog/undefined-local-variable-or-method-version_requirements-for-nameerror/ - 我将版本降级到1.4.2,现在它又可以工作了... - Mirko

137

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


35

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

require 'thread'

根据RubyGems 1.6.0的发布说明


24
如果你希望保持你的Rails版本不变,例如2.3.8,但是使用最新的gem版本,你可以使用这个解决方案Latest gem with Rails2.x。在这个解决方案中,需要对boot.rb文件和environment.rb文件进行一些修改。

在boot.rb文件顶部添加require 'thread',并且在environment.rb文件的initializer块之前添加以下代码。

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

4
谢谢,这是唯一一个解决我的方案。 - Christopher Pickslay

11

我在很多情况下都遇到了这个问题,当我尝试启动一个旧的 rails 2.3.5 项目,在使用过 rails 3 后。在我的情况下,为了解决这个问题,我必须将 rubygems 更新到版本 1.4.2,步骤如下:

sudo gem update --system 1.4.2

这对我们来说是最好的解决方案,因为Rails版本不能更改,更新涉及太多,但改变gem版本很容易! - Ian Vaughan

6
如果您正在使用Radiant CMS,则只需添加以下内容:
require 'thread'

config/boot.rb 文件置于顶部。

(感谢 Aaron 和 nathanvda 的回答。)


4

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

gem install rails --version 3.0.5

或者v2.3.11:

gem install rails --version 2.3.11

如果这不是一个新项目,你需要相应地升级你的应用程序。如果这是一个新项目,只需删除你创建它时的目录,然后再次创建新项目即可。

我使用了“gem install rails”,它起作用了。 - pw2

3
如上所述,当使用RubyGems 1.6.0与早于3版本的Ruby on Rails版本时会出现此问题。我的应用程序正在使用vendored到项目/vendor中的Ruby on Rails 2.3.3。
毫无疑问,将Ruby on Rails升级到更新的2.3.X版本也可能解决此问题。然而,此问题会阻止您运行Rake以取消vendored Ruby on Rails并升级它。
在environment.rb顶部添加require 'thread'对我没有解决问题。将require 'thread'添加到/vendor/rails/activesupport/lib/active_support.rb确实解决了问题。

1

更新 RubyGems

运行命令 gem update --system


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接