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のみを使うならファイルサイズ制限をかける