Carrierwave + Fog (S3) + Heroku: TypeError (не удается преобразовать хэш в строку)

У меня есть приложение на 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».

Действие создания контроллера My Albums:

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:

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

Мой конфиг.ру:

# 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

Я потратил кучу дней, пытаясь устранить эту ошибку, но безуспешно, что мне не хватает? Заранее спасибо.


person Pere Joan Martorell    schedule 23.09.2011    source источник
comment
попробуйте изменить http на https для Fog_directory, вот как это указано в документах github.com/jnicklas/carrierwave   -  person Hishalv    schedule 23.09.2011
comment
Я думаю, вы имеете в виду туман_хост вместо тумана_каталога, но я пробовал это, и у меня та же проблема. Теперь мне интересно, установлены ли у меня правильные разрешения на Amazon S3, вы что-нибудь знаете о правильной конфигурации? Спасибо   -  person Pere Joan Martorell    schedule 24.09.2011


Ответы (1)


После долгих дней разочарований я решил проблему. Это была такая глупость, как неправильное определение переменных среды ключей доступа S3 на Heroku. Я не понимаю, почему жемчужина тумана не дает более точной отладочной информации об ошибках такого рода.

person Pere Joan Martorell    schedule 25.09.2011