0

我在 Heroku 上有一个应用程序,它使用 Carrierwave 将图像上传到 S3。该应用程序在本地机器上完美运行,但在 Heroku 上抛出以下错误并无法上传到 S3:

TypeError (can't convert Hash into String):
2011-09-23T15:12:07+00:00 app[web.1]:   app/controllers/admin/albums_controller.rb:49:in `create'
2011-09-23T15:12:07+00:00 app[web.1]:   app/controllers/admin/albums_controller.rb:48:in `create'

该行对应于“if @album.save”指令。

我的相册控制器创建操作是:

def create
@album = Album.new(params[:album])

respond_to do |format|
  if @album.save
    format.html { redirect_to(admin_album_path(@album), :notice => 'Àlbum creat correctament.') }
    format.xml  { render :xml => [:admin, @album], :status => :created, :location => @album }
  else
    format.html { render :action => "new" }
    format.xml  { render :xml => @album.errors, :status => :unprocessable_entity }
  end
end
end

我的载波初始化器:

CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider               => 'AWS', 
      :aws_access_key_id      => APP_CONFIG['storage']['s3_access'],
      :aws_secret_access_key  => APP_CONFIG['storage']['s3_secret'],
    }
    config.fog_directory  = 'romeu'
    config.fog_host       = 'http://xxxxx.s3.amazonaws.com'
    config.fog_public     = true
    config.root = Rails.root.join('tmp')
    config.cache_dir = 'carrierwave'
end

我的 image_uploader.rb:

class ImageUploader < CarrierWave::Uploader::Base

include CarrierWave::MiniMagick

storage :fog

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

# Album Cover version
version :cover do
  process :square_resize => [150,150]
end

# Thumb version
version :thumb do
  process :square_crop => [80,80]
end

def square_crop(width, height)
  manipulate! do |img|
    side = [img['width'], img['height']].min
    x = (img['width'] - side) / 2
    y = (img['height'] - side) / 2
    img.crop("#{side}x#{side}+#{x}+#{y}")
    img.resize("#{width}x#{height}")
    img
  end
end

def square_resize(width, height)
  manipulate! do |img|
    img.resize("#{width}x#{height}")
    img
  end
end

# Valid list
def extension_white_list
    %w(jpg jpeg gif png)
end
end

我的 config.ru:

# This file is used by Rack-based servers to start the application.

require ::File.expand_path('../config/environment',  __FILE__)
use Rack::Static, :urls => ['/carrierwave'], :root => 'tmp'
run Encen::Application

我检查了@album 对象,一切似乎都很好:

_mounters: 
  :image: !ruby/object:CarrierWave::Mount::Mounter 
    _memoized_option: 
      ? 
        - :mount_on
      : 

    column: :image
    integrity_error: 
    options: {}

    processing_error: 
    record: *id001
    uploader: !ruby/object:ImageUploader 
      cache_id: 20110923-0810-1-0644
      file: !ruby/object:CarrierWave::SanitizedFile 
        content_type: image/jpeg
        file: /app/tmp/carrierwave/20110923-0810-1-0644/image.jpg
        original_filename: 
      filename: image.jpg
      model: *id001
      mounted_as: :image
      original_filename: image.jpg
      versions: 
        :thumb: !ruby/object: 
          file: !ruby/object:CarrierWave::SanitizedFile 
          cache_id: 20110923-0810-1-0644
            content_type: image/jpeg
            file: /app/tmp/carrierwave/20110923-0810-1-0644/image.jpg
            original_filename: 
          filename: image.jpg
          model: *id001
          mounted_as: :image
          original_filename: image.jpg
          parent_cache_id: 20110923-0810-1-0644
          versions: {}

        :cover: !ruby/object: 
          cache_id: 20110923-0810-1-0644
          file: !ruby/object:CarrierWave::SanitizedFile 
            content_type: image/jpeg
            file: /app/tmp/carrierwave/20110923-0810-1-0644/image.jpg
            original_filename: 
          filename: image.jpg
          model: *id001
          mounted_as: :image

attributes: 

  title: 
  body: 
    model: *id001
previously_changed: {}
readonly: false

我花了很多天打算解决这个错误但没有成功,我错过了什么?提前致谢。

4

1 回答 1

0

经过长时间的挫折,我已经解决了这个问题。这是一个愚蠢的事情,比如 Heroku 上 S3 访问密钥的环境变量定义不正确。我不明白为什么 Fog gem 没有为您提供有关此类错误的更准确的调试信息。

于 2011-09-25T16:19:10.407 回答