Неинициализированная константа ActiveSupport::Dependencies::Mutex (NameError)

Когда я хочу создать проект 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 ответов

Решение

Это несовместимость между Rails 2.3.8 и последними версиями RubyGems. Обновление до последней версии 2.3 (2.3.11 на сегодняшний день).

Если вы не можете перейти на Ruby on Rails 2.3.11 (и расширить ответ Дугласра), thread должно быть обязательно в верхней части boot.rb, Например:

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.

Если вы хотите сохранить свою версию такой же, как rails будет 2.3.8, а версия gem будет последней. Вы можете использовать это решение Последний гем с 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

Я сталкивался с этой проблемой во многих случаях, когда пытался запустить старый проект rails 2.3.5 после работы с rails 3>. В моем случае, чтобы решить проблему, я должен сделать обновление rubygems до версии 1.4.2, это:

sudo gem update --system 1.4.2

Если вы используете Radiant CMS, просто добавьте

require 'thread'

к вершине config/boot.rb,

(Благодарность ответам Аарона и Натанвды.)

Попробуйте обновить версию Ruby on Rails до версии 3.0.5:

gem install rails --version 3.0.5

или v2.3.11:

gem install rails --version 2.3.11

Если это не новый проект, вам необходимо соответствующим образом обновить приложение. Если это был новый проект, просто удалите каталог, в котором вы его создали, и снова создайте новый проект.

Как уже упоминалось, это происходит при использовании RubyGems 1.6.0 с более ранней версией Ruby on Rails, чем версия 3. Мое приложение использует Ruby on Rails 2.3.3, продаваемый в / vendor проекта.

Без сомнения, обновление Ruby on Rails до более новой версии 2.3.X также может решить эту проблему. Однако эта проблема не позволяет запустить Rake, чтобы отключить Ruby on Rails и обновить его.

Добавление require 'thread' в начало environment.rb не решило проблему для меня. Добавление require 'thread' в /vendor/rails/activesupport/lib/active_support.rb решило проблему.

Обновить рубины

обновление gem --system

Я выкладываю свое решение для других лишенных сна душ:

Если вы используете RVM, дважды проверьте, что вы находитесь в правильной папке, используя правильную версию ruby ​​и набор гемов. У меня был открыт массив вкладок терминала, и одна из них была в другом каталоге. набрав "rails console", я получил ошибку, потому что мой дистрибутив rails по умолчанию - 2.3.x.

Я заметил ошибку с моей стороны, cd'd в правильный каталог, и мой файл.rvmrc сделал все остальное.

RVM не похож на Git. В git смена веток в одной оболочке повсюду. Это буквально переписывает файлы, о которых идет речь. RVM, с другой стороны, просто устанавливает переменные оболочки и должен быть установлен для каждой новой оболочки, которую вы открываете.

Если вы не знакомы с.rvmrc, вы можете поместить файл с таким именем в любой каталог, и rvm подберет его и будет использовать указанную в нем версию /gemset при каждом переходе в этот каталог. Вот пример файла.rvmrc:

rvm use 1.9.2@turtles

Это переключится на последнюю версию ruby ​​1.9.2 в вашей коллекции RVM, используя набор "черепах". Теперь вы можете открыть сотню вкладок в терминале (как я в конечном итоге) и не беспокоиться о версии ruby, на которую она указывает.

Другие вопросы по тегам