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)
ファイルオブジェクトを分けることでエラーが発生しないようになります。