Rails7で「ActiveStorage::IntegrityError: ActiveStorage::IntegrityError」が発生した時の対応方法

created
updated

Active StorageでファイルをアタッチするとIntegrityErrorが発生

ActiveStorage::IntegrityError: ActiveStorage::IntegrityError
/app/app/db/seeds.rb:xx:in `<main>'

原因は、同じファイルオブジェクトを利用しているときに発生

Railsのソースコードのサンプル

# テスト用の画像オブジェクトを取得
def get_test_image
  file_path = "#{Rails.root}/tmp/images/sample.jpg"
  {
    image: File.open(file_path),
    filename: File.basename(file_path),
  }
end

# モデルにアタッチする
book_image = get_test_image

book.image1.attach({
  io: book_image[:image],
  filename: book_image[:filename],
})
book.image2.attach({
  io: book_image[:image],
  filename: book_image[:filename],
})

# => ActiveStorage::IntegrityError: ActiveStorage::IntegrityError

同じファイルオブジェクトを設定していますが、エラーが発生してしまいます。

対応方法はファイルオブジェクトを分ける

Railsのソースコードのサンプル

# テスト用の画像オブジェクトを取得
def get_test_image
  file_path = "#{Rails.root}/tmp/images/sample.jpg"
  {
    image: File.open(file_path),
    filename: File.basename(file_path),
  }
end

# モデルにアタッチする
book_image1 = get_test_image
book_image2 = get_test_image

book.image1.attach({
  io: book_image1[:image],
  filename: book_image1[:filename],
})
book.image2.attach({
  io: book_image2[:image],
  filename: book_image2[:filename],
})

# => 成功(Success)

ファイルオブジェクトを分けることでエラーが発生しないようになります。

TOP