我有一个使用 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 并在部署时重新启动服务器,但我也尝试过手动执行这两项操作而没有任何更改。
我在网上看到过一些类似的问题,但没有一个解决方案似乎与此相关——有人说它与 CarrierWave 无关,但没有说它与什么有关。
cap deploy:rollback
有人可以在我再次给我任何指示吗?
谢谢。
最近更新:
我在服务器上启动并运行了该应用程序。虽然require 'carrierwave'
在 application.rb 文件中不起作用,但以部署用户身份登录服务器,导航到应用程序目录,使用打开 rails 控制台RAILS_ENV=production bundle exec rails c
然后键入require 'carrierwave'
似乎已经使它起作用。
我还没有将其标记为已回答,因为我怀疑它可能会在下一次部署时再次停止,但它可能会缩小问题的范围。