carrierwave heroku - 不断收到错误信息

时间:2012-03-05 07:10:02

标签: ruby-on-rails heroku amazon-s3 carrierwave

我使用的是rails 3.2.1,carrierwave 0.5.8,fog 1.1.2,rmagick 2.13.1。

我正在尝试将产品图片上传到亚马逊s3上,但无论我在网上找到的carrierwave.rb初始化程序文件的排列是什么,我都会收到此错误消息(我想我已经尝试过所有这些) ,似乎没有工作。什么都没有上传到我的S3桶。对于我尝试过的其他版本,我得到了相同的错误消息。我想它可能是我的控制器中的东西,但不确定什么可以绊倒它。请帮助!

来自heroku日志的

错误消息:

2012-03-05T06:35:18+00:00 app[web.1]:   app/controllers/products_controller.rb:40:in `update'
2012-03-05T06:35:18+00:00 app[web.1]: ArgumentError (Missing required arguments:   aws_access_key_id, aws_secret_access_key):
2012-03-05T06:35:18+00:00 app[web.1]: cache: [POST /products/3] invalidate, pass

carrierwave初始化程序

CarrierWave.configure do |config|
 if Rails.env.production?
  config.storage = :fog
  config.fog_credentials = {
  :provider              => 'AWS',
  :aws_access_key_id     => 'access_key',
  :aws_secret_access_key => 'secret_access_key',
  :region                => 'us-east-1'
  }


 config.fog_directory  = 'bucket_name'
 config.fog_public     = true                                   
 config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}  

 else
  #for development and testing locally
  config.storage = :file
  config.enable_processing = false
 end
end

image_uploader

include CarrierWave::RMagick
  def store_dir
   "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb_pic do
   process :resize_to_limit => [170, 170]
  end
end

控制器

  def create
   @all_categories = get_all_categories
   checked_categories = get_categories_from(params[:categories])
   removed_categories = @all_categories - checked_categories
   @product = Product.new(params[:product])
   if @product.save
    checked_categories.each {|cat| @product.categories << cat if !@product.categories.include?(cat)}
    removed_categories.each {|cat| @product.categories.delete(cat) if @product.categories.include?(cat)}
    redirect_to(:action => 'list')
  else
   render "new"
  end
end

这是我在查看heroku配置时看到的内容

DATABASE_URL        => .....
GEM_PATH            => vendor/bundle/ruby/1.9.1
LANG                => en_US.UTF-8
PATH                => bin:vendor/bundle/ruby/1.9.1/bin:/usr/local/bin:/usr/bin:/bin
RACK_ENV            => production
RAILS_ENV           => production
S3_BUCKET           => bucket_name
S3_KEY              => access_key
S3_SECRET           => secret_access_key
SHARED_DATABASE_URL => .....

我已经花了两天时间在这上面,而且没有。

2 个答案:

答案 0 :(得分:1)

取出if Rails.env.production?

如果你做得对,你应该使用environment variables to store your credentials,你应该在功能方面matching your dev, test and productions environments(存储桶名称也可能是配置变量)

答案 1 :(得分:1)

我的代码有几个问题。我需要将config.fog_public更改为false(每个亚马逊)并且我的目标中存在雾宝石的问题。显然它没有传递信息。我不得不通过这两行手动添加信息:

compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => ACCESS_KEY_ID, :aws_secret_access_key => SECRET_ACCESS_KEY)

storage = Fog::Storage.new(:provider => 'AWS', :aws_access_key_id => ACCESS_KEY_ID, :aws_secret_access_key => SECRET_ACCESS_KEY)

之后,一切正常。此外,请确保将其置于字符串格式中,因为除非明确说明,否则rails不会将以字母大小写开头的任何内容识别为字符串。