LoginSignup
15
15

More than 5 years have passed since last update.

Carrierwaveで非同期処理・アップロードする

Last updated at Posted at 2015-05-05

Railsでファイルのアップロード実装が簡単に行えるCarrierWaveで、MiniMagickによるリサイズ処理や、AWSのS3へのアップロードを遅延実行する設定について。

専用のGemがあった。各種ワーカーにも対応しているよう。しかし、現在のサービスで使用しているQueに対応していないので、
sucker_punchを入れてワーカーに使用した。

インストール

  • gem 'carrierwave_backgrounder'
  • rails g carrierwave_backgrounder:install

sucker_punchの場合以下のように編集する。

CarrierWave::Backgrounder.configure do |c|
  #c.backend :delayed_job, queue: :carrierwave
  # c.backend :resque, queue: :carrierwave
  # c.backend :sidekiq, queue: :carrierwave
  # c.backend :girl_friday, queue: :carrierwave
   c.backend :sucker_punch, queue: :carrierwave
  # c.backend :qu, queue: :carrierwave
  # c.backend :qc
end

モデルに遅延処理の記述

class Post < AR::B  
  mount_uploader :image, ImageUploader
  process_in_background :image # プロセス処理の遅延実行
  store_in_background :image # アップロード処理の遅延実行 
・・・
process_in_background

特に何もしなくても遅延処理される。けれど、名前の付け替えをしている場合は注意が必要(後述)。
また、store_in_backgroundがオフならprocess前の元画像ファイルが一時的にアップロードされる。

store_in_background

上記の例であれば、image_tmpという列を追加する必要がある。
けれど、strong_parameterにremove_imageを追加すると処理が行われなくなるという問題がある。(2015/5時点)
多分以下のIssue

アップロードしたファイルの名前を付け替えている場合

PRがあったようだけど、ワーカーへの対応絡みでスルーされたみたい。

対応方法のようなISSUEがあったけど理解できなかった。

以下のように対処

  def filename
    "#{create_filename}.#{file.extension}" if original_filename.present?
  end

  protected
    def create_filename
      if model.changed?
        var = :"@#{mounted_as}_secure_token"
        model.instance_variable_get(var) or model.instance_variable_set(var, SecureRandom.urlsafe_base64)
      else
        model.send(mounted_as).file.filename.split('.')[0]
      end
    end

メモ

  • process_in_backgroundのみを使うならファイルサイズ制限をかける
15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15