4

My Railsアプリはcarrierwaveを使用して画像のアップロードを管理します。私は自分のサイトに画像の透かしバージョンを持っています。以前、私はそうのように、それらの画像を重ね合わせた。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 

を今、これは新しいイメージのために動作しますが、私はrecreate_versionsを呼び出すときに!古い写真は置き換えられません。この新しいウォーターマークを古いものに置き換えるにはどうしたらいいですか?

私はAmazon S3で開発と生産の両方のストレージにFogを使用しています。

答えて

8

これは非常に同じ問題ではないかもしれませんが、googleabilityのために:

我々はthis discussion threadに記載されているものに類似したファイル名のランダムなハッシュを持っています。

イメージを再生成すると、新しいハッシュを使用して新しいイメージが生成されますが、データベースに保存されているファイル名は更新されないため、古い名前のイメージが表示されます。

これは、問題を再現:

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">] 

編集:

は、実は、上記はなく、霧と、ディスク上のファイルと働きました。自分で簡単にできるようにするには、画像を作り直して古い画像を削除するだけでした。

Image.all.each { |old| 
    new = Image.new(foo_id: old.foo_id, image: old.image) 
    new.save! 
    old.destroy 
} 
+0

これは私が持っていた問題を正しく特定しています。私は若干異なる解決法を考え出したが、これはうまくいく。 – Andrew

+0

提案してくれてありがとう、私も同様の問題があった。私の問題の解決策は、生成された新しいファイルの名前が異なることを確認することでした。 –

+0

これをもう一度やり直さなければならなかったのですが、フォグ(S3)を使って画像全体(すべてのバージョンを含む)を再生成するためにこのようなことをしました: 'record.remote_image_url = record.image_url; i.save! ' –

3

あなたはこの方法自体は、ファイルがキャッシュされている場合ことを呼び出しますが、何らかの理由でそれが働いていなかったので、それは奇妙だrecreate_versions!

を呼び出す前にimage.cache_stored_file!を呼び出す必要があります。

関連する問題