Это может быть не совсем та же проблема, но для googleability:
У нас есть случайный хеш в имени файла, похожий на тот, который описан в этой ветке обсуждения .
При регенерации изображений он будет генерировать новые изображения с использованием нового хэша, но не будет обновлять имя файла, хранящееся в базе данных, поэтому он попытается отобразить изображения со старыми именами.
Это воспроизводит проблему:
bundle exec rails runner "Foo.find(123).images.each { |img| uploader = img.image; puts %{before: #{img.image.inspect}}; uploader.recreate_versions!; puts %{after: #{img.reload.image.inspect}} }; p Foo.find(123).images"
Это дает вывод как
before: /uploads/foo_123_6a34e47ef5.JPG
after: /uploads/foo_123_d9a346292d.JPG
[#<Image id: 456, foo_id: 123, image: "foo_123_6a34e47ef5.JPG">]
Но добавление img.save!
после воссоздания версий исправляет это:
bundle exec rails runner "Foo.find(123).images.each { |img| uploader = img.image; puts %{before: #{img.image.inspect}}; uploader.recreate_versions!; img.save!; puts %{after: #{img.reload.image.inspect}} }; p Foo.find(123).images"
С выходом:
before: /uploads/foo_123_6a34e47ef5.JPG
after: /uploads/foo_123_d9a346292d.JPG
[#<Image id: 456, foo_id: 123, image: "foo_123_d9a346292d.JPG">]
Edit:
На самом деле вышеописанное работало с файлами на диске, но не с туманом. Чтобы упростить себе задачу, я просто воссоздал изображения и удалил старые:
Image.all.each { |old|
new = Image.new(foo_id: old.foo_id, image: old.image)
new.save!
old.destroy
}