carrierwave_backgrounderを使い画像のアップロードを非同期にしました。  
開発環境では正しく動くのですが、herokuにデプロイしたらキューが開始されません

![画像の説明をここに入力](https://i.stack.imgur.com/N5W6F.png)

AmazonのS3を使用していて、エラー内容をみると/app/public/uploads/tmp/となっているのでおかしいというのはわかるのですが、どこを直せばいいかわかりません

carrierwave_backgrounderを使う前はheroku環境でもアップロードできました。

```

    # app/uploaders
    class PictureUploader < CarrierWave::Uploader::Base
      include CarrierWave::MiniMagick
    
      version :thumb1 do
        process :resize_to_limit => [840,1336]
      end
    
      version :thumb2 do
        process :resize_to_limit => [420,840]
      end
    
      version :thumb3 do
        process :resize_to_fill => [200,200]
      end
    
      # CarrierWaveでアップロードした写真（画像）が回転して表示されるのを直す
      process :fix_rotate
      def fix_rotate
        manipulate! do |img|
          img = img.auto_orient
          img = yield(img) if block_given?
          img
        end
      end
    
      # バッググランド処理
      include ::CarrierWave::Backgrounder::Delay
    
      # S3 strage
      storage :fog
    
      # 画像の上限を700pxにする
      process :resize_to_limit => [1366, 1366]
    
      # 保存形式をJPGにする
      process :convert => 'jpg'
    
      # 許可する画像の拡張子
      def extension_white_list
        %w(jpg jpeg gif png)
      end
    
    # 変換したファイルのファイル名の規則
      def filename
        "#{secure_token}.png" if original_filename.present?
      end
    
      protected
      def secure_token
        var = :"@#{mounted_as}_secure_token"
        model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.uuid)
      end
    end
    
    
    
    # config/initializer/carrierwave.rb
    CarrierWave.configure do |config|
      config.fog_credentials = {
          :provider               => 'AWS',
          :aws_access_key_id      => 'xxxxxxxxxxxxxxxxxx',
          :aws_secret_access_key  => 'xxxxxxxxxxxxxxxxxx',
          :region => 'ap-northeast-1'
      }
    
    
      config.fog_directory = 'appnamedevelopment' if Rails.env.development?
      config.fog_directory = 'appnameproduction' if Rails.env.production?
    end
    
    
    # config/initializer/carrierwave_backgrounder.rb
    CarrierWave::Backgrounder.configure do |c|
      c.backend :sidekiq, queue: :carrierwave
    end
    
```

# 変更後

```

    CarrierWave.configure do |config|
      config.cache_dir = "#{Rails.root}/tmp/uploads"
      config.fog_credentials = {
            :provider               => 'AWS',
            :aws_access_key_id      => 'xxxxxxxxxxxxxxxxxx',
            :aws_secret_access_key  => 'xxxxxxxxxxxxxxxxxx',
            :region => 'ap-northeast-1'
      }
    
      config.storage = :fog
      config.fog_directory = 'appnamedevelopment' if Rails.env.development?
      config.fog_directory = 'appnameproduction' if Rails.env.production?
      config.fog_public = true
      config.fog_authenticated_url_expiration = 60
    end
    
```

# エラー

```

    Rendering 500 with exception: undefined method `cache_name' for #<CarrierWave::Mounter:0x007fd0bd830d98>
    
```
CC BY-SA 3.0
2015-07-20T08:52:57.177
12497
2016-07-06T16:31:39.050
2015-07-21T02:41:25.540
9161
9161
question
ruby-on-rails
Rails4.2 carrierwave_backgrounderについて
carrierwave ではなく、heroku に原因があるのかもと思います。

carrierwave は、ファイルをアップロードするとき、一旦キャッシュディレクトリに置きます。

```

    クライアント → サーバ上のキャッシュディレクトリ → S3
    
```

backgrounder を使うと、キャッシュに置いた状態で、処理をキューに委譲します。

```

    クライアント → サーバ上のキャッシュディレクトリ (← ココで処理は終了)
    sidekiq:  サーバ上のキャッシュディレクトリ → S3
    
```

エラーは、sidekiq が`キャッシュディレクトリに置いてあるファイル`が見つからないよ、と言っています。  
sidekiq が動いているサーバと、アプリケーションが動いているサーバが別だったりしないでしょうか？

解法としては、下記の記事を見つけました。  
[CarrierwaveでS3にアップロードさせるとき、キャッシュもS3に置く -
Qiita](http://qiita.com/doima_/items/677a8acbcaf018dd9ec9#comment-f2a6a5996b005d2b9001)

または、store_in_background を使わないという選択肢もあるかと思います。  
(レスポンスが許せば、ですが)

参考  
[Ruby - HerokuでCarrierWaveを使う場合に注意すること -
Qiita](http://qiita.com/Oakbow/items/802da14fa3cf67763ba7)
CC BY-SA 3.0
2015-07-21T00:13:20.917
12512
2015-07-21T00:13:20.917
7471
12497
answer