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

Ruby on rails 未初始化的常量ActiveSupport::Dependencies::Mutex(NameError),ruby-on-rails,rubygems,compatibility,Ruby On Rails,Rubygems,Compatibility,当我想创建一个RubyonRails项目时,我得到以下消息 /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.r

当我想创建一个RubyonRails项目时,我得到以下消息

/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版本更新到v3.0.5:

gem install rails --version 3.0.5
或v2.3.11:

gem install rails --version 2.3.11

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

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

require 'thread'

根据RubyGems 1.6.0.

如前所述,在RubyGems 1.6.0和Ruby on Rails版本早于版本3的情况下,会出现这种情况。我的应用程序正在使用RubyonRails 2.3.3作为项目的/供应商

毫无疑问,将RubyonRails升级到更新的2.3.X版本也可以解决这个问题。然而,这个问题阻止您运行unvendorubyonrails并升级它


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

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

若你们想保持你们的版本和rails一样,那个么rails将是2.3.8,而gem版本将是最新的。您可以使用此解决方案。在本文中,boot.rb文件和environment.rb文件中有一些更改

需要在boot.rb文件顶部的“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

我可以通过将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
的顶部


(感谢亚伦和纳桑夫达的回答。)

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

如果您使用的是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”。现在,您可以在Terminal中打开一百个选项卡(就像我最后所做的那样),而不用担心它所指向的ruby版本。

在使用rails 3>之后,当我尝试启动一个旧的rails 2.3.5项目时,我曾多次遇到过这个问题。就我而言,为了解决这个问题,我必须对1.4.2版进行rubygems更新,这是:

sudo gem update --system 1.4.2
更新rubygems


gem update--system

你能发布
gem--version
的输出吗?谢谢,这是唯一能帮我做到这一点的解决方案。在拥有rails 3+Rubygems 1.6+之后,我遇到了运行2.3.5 rails应用程序的问题。这解决了它,谢谢。它对我不起作用<代码>未定义的局部变量或方法版本35;谢谢!也为我工作:@aaron你编辑了我的答案,在命令前面添加了sudo,但afaik sudo并不总是合适的(比如使用rvm等)。人们可以根据需要添加它。或者如果您正在使用rvm(在需要返回并支持旧代码库时非常理想!):rvm rubygems 1.5.3在
boot.rb
本身的顶部添加它更容易。将它添加到boot.rb应该是正确的答案。我如何添加require线程?在哪个文件中?我的意思是,没有创建rails项目。这是核心的变化吗?@alfizqu,文件是
/lib/ruby/gems//gems/rails-/environments/boot.rb
我已经将它添加到config/boot.rb中,但它对我不起作用。这对我们来说是最好的解决方案,因为rails版本不能更改,更新太多了,但是更改gem版本,非常简单!