Ruby 1.9.3 と Rails 3.2.13 を使用して、Mac OS X でローカルに完全に動作する Rails アプリがあります。これは、Capistrano を使用して Ubuntu 仮想サーバー (nginx / unicorn) にデプロイされ、正常に動作しています。
RMagick を使用して CarrierWave gem をインストールしたときに問題が発生しました。これらは 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 は bundle:install を実行し、展開時にサーバーを再起動しますが、変更を加えずに両方を手動で実行しようとしました。
オンラインで同様の問題がいくつか報告されているのを見たことがありますが、これに関連すると思われる解決策を示したものはありません。
私が再びいる間、誰か私に何か指針を教えてもらえますcap deploy:rollback
か?
ありがとう。
最新の更新:
サーバー上でアプリを起動して実行しています。application.rb ファイルでは機能しませrequire 'carrierwave'
んでしたが、デプロイ ユーザーとしてサーバーにログインし、app ディレクトリに移動し、Rails コンソールを開いてRAILS_ENV=production bundle exec rails c
入力するrequire 'carrierwave'
と、機能したようです。
次の展開ですべてが再び停止する可能性があると思われるため、まだ回答済みとしてマークしていませんが、問題を絞り込む可能性があります。