Неинициализированная константа 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?
Эндрю Маршалл

Ответы:

137

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

Джон
источник
211

В случае, если вы не можете перейти на 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
...
Аарон
источник
28
Еще проще добавить его наверх boot.rb.
Натанвда
12
Добавление его в boot.rb должно быть правильным ответом.
радиоспил
1
как добавить нужную ветку? В каком файле? Я имею в виду, что проект рельсов не создан. Это изменение в ядре?
alfizqu
@alfizqu, файл<RUBYDIR>/lib/ruby/gems/<VERSION>/gems/rails-<VERSION>/environments/boot.rb
JellicleCat
Я добавил его в config / boot.rb, но он не работает для меня. Где я должен это добавить?
Амрит Дхунгана
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
Возникла проблема с запуском приложения 2.3.5 rails после наличия rails 3 + Rubygems 1.6+. Это решило это, спасибо.
RoR
4
Это не работает для меня ... undefined local variable or method version_requirements for #<Rails::GemDependency:0x2b001603fe30>
Ray301
Спасибо! Работа для меня тоже:]
mr.pppoe
4
@aaron Вы отредактировали мой ответ, добавив sudo перед командами, но afaik sudo не всегда подходит (например, при использовании rvm и т. д.). Люди могут добавлять его по мере необходимости.
Гэри С. Уивер
5
или если вы используете rvm (идеально, когда нужно вернуться и поддерживать старые базы кода!): rvm rubygems 1.5.3
поздний срок
24

Если вы хотите сохранить свою версию такой же, как 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
arunagw
источник
4
Спасибо, это единственное решение, которое сделало это для меня.
Кристофер Пиксли
11

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

sudo gem update --system 1.4.2
Таня Р
источник
Это лучшее решение для нас, так как версия rails не может измениться, слишком много связано с ее обновлением, но изменение версии gem, легко и просто!
Ян Воан
6

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

require 'thread'

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

(Престижность ответов Аарона и Натанвды.)

thekingoftruth
источник
3

Как уже упоминалось, это происходит при использовании 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 решило проблему.

Пол Грейсон
источник
3

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

gem install rails --version 3.0.5

или v2.3.11:

gem install rails --version 2.3.11

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

Эндрю Маршалл
источник
1

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

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

Вишну Атраи
источник
-1

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

Если вы используете 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, на которую он указывает.

Хайме Беллмайер
источник