Carrierwave + Fog (S3) + Heroku: TypeError (невозможно преобразовать хэш в строку) - PullRequest
0 голосов
/ 23 сентября 2011

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

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

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

1 Ответ

0 голосов
/ 25 сентября 2011

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

...