3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CarrierWave使用時はコールバックの設定位置に注意

Posted at

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の保存処理で不具合が生じた場合は参考にしてみてください。

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?