未初始化常量CarrierWave。

4

我正在使用Passenger和Capistrano部署我的第一个Rails应用程序。

一切都很顺利,直到在尝试在浏览器中启动应用程序时遇到了这个错误。

Error message:
   uninitialized constant CarrierWave

Exception class:
   NameError

您可以在http://test.ajhezaty.com/上详细查看消息。

该网站在本地运行完美,并且CarrierWave正确上传图像。

我尝试通过运行以下命令重新启动VPS服务器:

sudo /etc/init.d/httpd2 restart

但是它并没有解决问题。

供您参考,宝石已安装在服务器上。

 $ gem list | grep carrierwave
 carrierwave (0.6.1)
2个回答

15

您需要像这样将carrierwave添加到您的application.rb文件中:

require File.expand_path('../boot', __FILE__)

require 'rails/all'

require 'carrierwave'

if defined?(Bundler)
  # Bundler stuff
end

# Rest of file ommited.

在使用nginx/unicorn的生产环境中,这对我起作用了。别忘了重新启动你的unicorn服务器。


Stefano,你能解释一下为什么需要这样吗?这在我这里可行,但是我没有必须对任何其他宝石进行此操作。事实上,我不需要对CarrierWave进行此操作,仅对CarrierWave_Backgrounder进行操作。 - Tyler Collier
很抱歉,TylerCollier。我不知道该怎么做。我只是需要快速解决问题。 - Stephan1990
最好的选择是在 Github 上询问。我只使用 Carrierwave,对此一无所知。 - Stephan1990

2

您可能已经在本地安装了这个gem,但请确保将其添加到您的Gemfile中,通过ssh进行bundle install,并在将使用它的控制器中require它。


gem list | grep carrierwave carrierwave(0.6.1)是什么意思?需要在将使用它的控制器中require吗?没有这样做,应用程序在本地运行! - Abdulaziz Alsubaie
2
在使用 gem 的任何控制器中,您都应该指定该要求。例如,如果您正在使用 CarrierWave,请进入“pictures”控制器或您称之为什么的控制器,并键入 require 'carrierwave'。这确保它被调用。您的应用程序在本地工作是因为 gem 在操作系统级别安装...也就是说,它不仅是 Rails 的 gem,而且是 Ruby 的所有 gem。因此,在 Gemfile 中,您必须指定应用程序需要哪些 gem,以便在部署时,应用程序在操作系统级别(服务器)收集所有依赖项。 - DerektheDev
仅仅因为你在本地输入了“gem install carrierwave”并不意味着它已经安装在远程服务器上。因此需要使用Gemfile,并在远程服务器上运行bundle install命令。 - DerektheDev
日志显示所有内容已成功迁移和完成。我注意到了一些奇怪的事情,当我从部署位置cat Gemfile时,它显示的内容与我在部署中工作的内容不同!我该如何使它们相匹配?是否有什么可以告诉Cap命令的东西? - Abdulaziz Alsubaie
我没有使用过Capistrano,但是你可以通过FTP/git将你的Gemfile部署到服务器上。这可能是问题所在。你的Gemfile必须在两个位置完全相同,否则你的应用程序将无法理解它的依赖关系。 - DerektheDev
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接