Я не могу точно воспроизвести вашу проблему (я получаю ActiveStorage::IntegrityError
исключений, а не ActiveStorage::FileNotFoundError
), но я думаю, что знаю, что происходит. После первого прикрепления изображения:
project.images.attach(io: image_file, filename: "placeholder_image.png", content_type: "image/png")
текущая позиция image_file
будет в конце файла. Теперь, когда Active Storage снова пытается прочитать файл, он не получит никаких данных, поэтому либо контрольная сумма не удалась (мой IntegrityError
), либо данные Active Storage о том, что там нет файла (ваш FileNotFoundError
).
Решение состоит в том, чтобы сбросить позицию файла обратно в начало, вызвав #rewind
:
rand(1..3).times do
project.images.attach(io: image_file, filename: "placeholder_image.png", content_type: "image/png")
image_file.rewind
end
Вы можете image_file.rewind
до или после вызова project.images.attach
, перемотка только что открытого файла не делает ничего интересного. #rewind
не всегда будет поддерживаться (или желаться) io
, который вы передаете #attach
, поэтому Active Storage не может сделать это сам.
Кроме того, вы можете открыть файл на каждой итерации:
rand(1..3).times do
image_file = File.open("./db/seed_files/placeholder_image.png")
project.images.attach(io: image_file, filename: "placeholder_image.png", content_type: "image/png")
end
Я предполагаю, что отсутствующий do
для блока times
в вашем вопросе - просто опечатка.