"неинициализированная константа CarrierWave" при развертывании приложения Rails на сервере с Capistrano
У меня есть приложение Rails, которое прекрасно работает локально на Mac OS X с использованием Ruby 1.9.3 и Rails 3.2.13. Он был развернут на моем виртуальном сервере Ubuntu (nginx / unicorn) с использованием Capistrano и работает нормально.
Проблема возникла, когда я установил гем CarrierWave с помощью RMagick. Они были добавлены в gemfile и отлично работали локально, но при развертывании на сервере я каждый раз получаю 500 ошибок.
Краткая выдержка из unicorn.log на сервере:
E, [2013-06-28T12:04:05.937845 #2758] ERROR -- : reaped #<Process::Status: pid 23786 exit 1> worker=0
I, [2013-06-28T12:04:05.939517 #2758] INFO -- : worker=0 spawning...
I, [2013-06-28T12:04:05.968225 #23793] INFO -- : worker=0 spawned pid=23793
I, [2013-06-28T12:04:05.969959 #23793] INFO -- : Refreshing Gem list
E, [2013-06-28T12:04:59.669504 #23793] ERROR -- : uninitialized constant CarrierWave (NameError)
/home/deployer/apps/panto/releases/20130628115346/app/uploaders/image_uploader.rb:3:in `<top (required)>'
/home/deployer/apps/panto/releases/20130628115346/app/models/picture.rb:4:in `<class:Picture>'
/home/deployer/apps/panto/releases/20130628115346/app/models/picture.rb:1:in `<top (required)>'
Файл, указанный в ошибке "неинициализированная константа", - это мой класс загрузчика CarrierWave, созданный собственным генератором CarrierWave, который начинается:
# encoding: utf-8
class ImageUploader < CarrierWave::Uploader::Base
# Include RMagick or MiniMagick support:
include CarrierWave::RMagick
# include CarrierWave::MiniMagick
# Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
include Sprockets::Helpers::RailsHelper
include Sprockets::Helpers::IsolatedHelper
Следовательно, ошибка связана с наследованием основного класса CarrierWave.
Извлечение из Gemfile:
gem 'jquery-rails'
gem 'simple_form'
gem 'country_select'
gem 'carrierwave'
gem 'rmagick'
И из Gemfile.lock:
carrierwave (0.8.0)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
...
rmagick (2.13.2)
Эти файлы идентичны в моем git-хранилище и на сервере. Это кажется достаточным для моего локально запускаемого приложения, чтобы найти CarrierWave, но не для версии сервера.
Capistrano запускает связку: устанавливает и перезапускает сервер при развертывании, но я попытался сделать оба вручную без каких-либо изменений.
Я видел несколько похожих проблем, о которых сообщалось в Интернете, но ни одна из них не имела решения, которое, похоже, связано с этим - некоторые говорят, что оно не имеет никакого отношения к CarrierWave, но не говорят, какое оно имеет отношение к делу.
Может кто-нибудь дать мне какие-нибудь указатели, пожалуйста, пока я cap deploy:rollback
снова?
Благодарю.
Последнее обновление:
У меня есть приложение и работает на сервере. В то время как require 'carrierwave'
не работал в файле application.rb, входя на сервер как пользователь развертывания, переходя в каталог приложения, открывая консоль rails, используя RAILS_ENV=production bundle exec rails c
а затем печатать require 'carrierwave'
кажется, заставил это работать.
Я пока не отмечаю это как ответ, поскольку подозреваю, что все может снова остановиться при следующем развертывании, но, возможно, это сузит проблему.
1 ответ
Похоже, это может быть связано с требуемым порядком драгоценных камней. См. Этот вопрос о стековом потоке в контексте Некоторые люди, кажется, взбираются на это с явным требованием в application.rb (как это), но мы надеемся изменить порядок в Gemfile на:
gem 'rmagick'
gem 'carrierwave'
должен это исправить.
Также это может помочь убедиться, что RMagick правильно установлен на вашем сервере.