Rails: Carrierwave воссоздает версии, не изменяя старые изображения - PullRequest
4 голосов
/ 25 августа 2011

Приложение My Rails использует carrierwave для управления загрузкой изображений. У меня есть версия изображений с водяным знаком на моем сайте. Ранее я наложил на них изображение, например:

def watermark
    manipulate! do |img|
        logo = Magick::Image.read("#{Rails.root}/public/images/plc-watermark.png").first
        img = img.composite(logo, Magick::SouthEastGravity, Magick::OverCompositeOp)
    end
end

Теперь я накладываю текст следующим образом:

def watermark
    manipulate! do |img|
        text = Magick::Draw.new
        text.gravity = Magick::CenterGravity
        text.pointsize = 12
        text.font = "#{Rails.root}/public/fonts/hn300.ttf"
        text.stroke = 'none'
        text.annotate(img, 0, 0, 0, 0, "Photo © #{model.user.full_name}\nHosted by Placeology.ws\nPlease log in to remove this watermark")
        img
    end
end

Теперь, это работает для новых изображений, но когда я вызываю restate_versions! старые фотографии не заменяются. Как я могу получить этот новый водяной знак, чтобы заменить старый?

Для чего я стою, я использую Fog с Amazon S3 для хранения как в разработке, так и в производстве.

Ответы [ 2 ]

8 голосов
/ 01 ноября 2011

Это может быть не совсем та же проблема, но для 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
}
4 голосов
/ 20 сентября 2011

Вам необходимо вызвать image.cache_stored_file! перед вызовом recreate_versions!

Это странно, потому что сам метод вызывает это, если файл кэшируется, но по какой-то причине он не работает.

...