Неинициализированная константа 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 решило проблему.
Я выкладываю свое решение для других лишенных сна душ:
Если вы используете 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, на которую она указывает.