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

Posted

技术标签:

【中文标题】未初始化的常量 ActiveSupport::Dependencies::Mutex (NameError)【英文标题】:Uninitialized constant ActiveSupport::Dependencies::Mutex (NameError) 【发布时间】:2011-07-07 19:13:16 【问题描述】:

当我想创建一个 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的输出吗? 【参考方案1】:

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

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

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

【讨论】:

谢谢,这是为我完成的唯一解决方案。【参考方案2】:

更新红宝石

宝石更新--系统

【讨论】:

【参考方案3】:

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

【讨论】:

boot.rb本身的顶部添加它更容易。 将它添加到 boot.rb 实际上应该是正确的答案。 如何添加 require 线程?在哪个文件中?我的意思是,没有创建 rails 项目。是核心的变化吗? @alfizqu,文件是<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb 我已将它添加到 config/boot.rb 但它对我不起作用。我必须在哪里添加它?。【参考方案4】:

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

gem install rails --version 3.0.5

或 v2.3.11:

gem install rails --version 2.3.11

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

【讨论】:

【参考方案5】:

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

sudo gem update --system 1.4.2

【讨论】:

这对我们来说是最好的解决方案,因为 rails 版本无法更改,更新涉及太多,但是更改 gem 版本,又好又容易!【参考方案6】:

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

如果您使用的是 RVM,请使用正确的 ruby​​ 版本和 gemset 仔细检查您是否位于正确的文件夹中。我打开了一系列终端选项卡,其中一个位于不同的目录中。输入“rails console”会产生错误,因为我的默认 rails 发行版是 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。现在您可以在终端中打开一百个选项卡(就像我最终所做的那样),而不必担心它指向的 ruby​​ 版本。

【讨论】:

【参考方案7】:

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

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

【讨论】:

在使用 rails 3 + Rubygems 1.6+ 后运行 2.3.5 rails 应用程序出现问题。这解决了,谢谢。 它对我不起作用...undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30> 谢谢!也为我工作:] @aaron 您编辑了我的答案以在命令前面添加 sudo,但 afaik sudo 并不总是合适的(例如在使用 rvm 时等)。人们可以根据需要添加它。 或者如果您使用的是 rvm(在需要返回并支持旧代码库时非常理想!):rvm ruby​​gems 1.5.3【参考方案8】:

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

require 'thread'

config/boot.rb的顶部。

(感谢 Aaron 和 nathanvda 的回答。)

【讨论】:

【参考方案9】:

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

毫无疑问,将 Ruby on Rails 升级到更新的 2.3.X 版本也可以解决这个问题。但是,此问题会阻止您运行 Rake 以取消供应商 Ruby on Rails 并对其进行升级。

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

【讨论】:

【参考方案10】:

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

require 'thread'

根据 RubyGems 1.6.0 release notes。

【讨论】:

【参考方案11】:

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

【讨论】:

以上是关于未初始化的常量 ActiveSupport::Dependencies::Mutex (NameError)的主要内容,如果未能解决你的问题,请参考以下文章

未初始化的常量 Logger (NameError)

rails 链接表“未初始化的常量”错误

HomePresenter 的未初始化常量

Rails:NameError:未初始化的常量

未初始化的常量 Twitter (NameError)

NameError 未初始化常量 Model::Object