名称错误:Heroku日志中的CarrierWave :: Storage :: Fog未初始化常量

4

你好,我刚刚将AWS S3 Bucket添加到我的应用程序中。

这是应用程序的错误信息:https://dry-atoll-6663.herokuapp.com/

当我执行$heroku restart时,在Heroku日志中出现了这个错误。

2015-04-28T09:13:15.009823+00:00 app[web.1]: [3] ! Unable to load application: NameError: uninitialized constant CarrierWave::Storage::Fog

我的Carrierwave.rb

CarrierWave.configure do |config|
config.fog_credentials = {
  # Configuration for Amazon S3
  :provider              => 'AWS',
  :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
  :aws_secret_access_key => ENV['S3_SECRET_KEY']
}
config.fog_directory     =  ENV['S3_BUCKET']
end

有什么想法吗?我和我的朋友都很困惑...

你实际上是在哪里创建了这个carrierwave.rb文件? - Developer
另外,您可以查看一些演示应用程序,例如https://github.com/trevorturk/carrierwave-heroku,并且还可以查看此http://qiita.com/kimihito_/items/3ff9c0c4407447ee3ab3 - Developer
我看到你正在从环境变量中加载S3密钥。你确定在Heroku上设置了这些环境变量吗?另外,在部署应用程序时是否遇到任何错误?也许CarrierWave在部署过程中没有成功安装或者出现了其他问题? - jefflunt
这可能是一个愚蠢的问题,但是你的Gemfile里是否有gem 'fog' - trushkevich
2
我刚刚更新了carrierwave gem,看起来他们在配置中更新了所需的信息:https://github.com/carrierwaveuploader/carrierwave#using-amazon-s3 它给了我相同的错误消息,更新配置解决了问题。 - Marcus
是的,更新修复了它。 - joeyk16
3个回答

6

感谢评论区的 Marcus 正确回答了这个问题。

在你的 config/initializers/carrierwave.rb 文件中,你需要进行更新。

CarrierWave.configure do |config|
  # This is the old way, and broken
  config.storage = :fog

转换为

CarrierWave.configure do |config|
  # This is the new way!
  config.fog_provider = 'fog/aws'

更多信息请参考carrierwave的GitHub页面


1

在苦恼了几个小时之后,我终于确定这似乎是由最近的carrierwave (0.10.0)问题引起的。

感谢GitHub用户trantorLiu, 这就是让我解决问题的方法:

I also encountered this issue. I fixed it by specify an older Carrierwave revision in Gemfile.lock.

Here's my Gemfile.lock. Revision 37cf31d doesn't work for me, so I rollbacked to cb1a5bf. And then everything worked as it used to be.

GIT
  remote: git://github.com/carrierwaveuploader/carrierwave.git
  revision: cb1a5bfc6601a4e5d0abb6bad17911d73dcb57e3
  specs:
    carrierwave (0.10.0)
      activemodel (>= 3.2.0)
      activesupport (>= 3.2.0)
      json (>= 1.7)
      mime-types (>= 1.16)

Here's my Gemfile. FYI.

gem 'fog', require: 'fog/aws'
gem 'carrierwave', github: 'carrierwaveuploader/carrierwave'

如果有帮助的话,这是我的config/initializers/carrierwave.rb文件:

CarrierWave.configure do |config|
  if Rails.env.development?
    config.storage = :file
  elsif Rails.env.test?
    config.storage = :file
    config.enable_processing = false
  else
    config.storage = :fog
    config.fog_credentials = {
      provider:               'AWS',
      aws_access_key_id:      Rails.configuration.aws.access_key_id,
      aws_secret_access_key:  Rails.configuration.aws.secret_access_key,
    }
    config.fog_directory  = Rails.configuration.files.aws_bucket
  end
end

1
在进一步审查后,我决定完全放弃使用fog。最终我使用了carrierwave-aws。配置几乎相同。
我的新的config/initializers/carrierwave.rb文件:
CarrierWave.configure do |config|
  if Rails.env.development?
    config.storage = :file
  elsif Rails.env.test?
    config.storage = :file
    config.enable_processing = false
  else
    config.storage = :aws
    config.aws_bucket = Rails.configuration.files.aws_bucket
    config.aws_acl = 'public-read'
    config.aws_credentials = {
      access_key_id: Rails.configuration.aws.access_key_id,
      secret_access_key: Rails.configuration.aws.secret_access_key,
      region: Rails.configuration.aws.region,
    }
  end
end

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