Ruby on Railsをで画像をアップロードする際によく採用されるCarrierWaveを使っている際にコールバックの設定で詰まったことがあったので備忘録として残しておきます。
行ったこと
Imageモデルに対してafter_commitでsave時に追加で処理を設定しました。
class Image < ApplicationRecord
mount_uploader :image, ImageUploader
after_save_commit :send_message
def send_message
...
end
end
発生した問題
store_dir
に画像が保存されず、cache_dir
のデータのままデータが変わらなくなってしまいました。
# 保存前
uploads/tmp/hoge.jpg
# 保存後
uploads/images/hoge.jpg
after_commitを使用している例もあり、実装としてNGではなさそう。
対処法
調べてみると、CarrierWave側にもコールバックが色々設定されていました。
after_save :"store_#{column}!"
before_save :"write_#{column}_identifier"
after_commit :"remove_#{column}!", :on => :destroy
after_commit :"mark_remove_#{column}_false", :on => :update
...
今回動いていないのはafter_save :"store_#{column}!"
のstoreの処理。モデルの書き方でコールバックが競合しているのかなと思い、mount_uploader
の位置を変更してみたところ、無事解決しました。
# 変更前
class Image < ApplicationRecord
mount_uploader :image, ImageUploader
after_save_commit :send_message
...
end
# 変更後
class Image < ApplicationRecord
after_save_commit :send_message
mount_uploader :image, ImageUploader
...
end
CarrierWaveの保存処理で不具合が生じた場合は参考にしてみてください。