フォグ (1.18.0)、mini_magick (3.6.0)、および Rackspace CloudFiles で Carrierwave (0.9.0) を使用しています。画像を合成したい。
Products と Emails の 2 つのモデルがあります。製品アップローダで、すべての電子メールをループ処理し、それぞれの上に製品画像を合成するプロセスを作成しようとしていますemail.background_image
。また、この画像の名前を次のように制御したいと思います。
"#{email.name}_#{product.product_number}.jpg"
以下に私のプロセスと方法を含めました。「email_123.png」という名前のクラウドファイルにアップロードされたファイルと元の画像のテスト結果。現在、名前にはメールの名前が含まれておらず、画像は合成されていません。元のメールが返ってきただけです。ここで私が見逃していることは明らかですか?ありがとう!
version :email do
process :email_composite
def email_composite
Email.all.each do |email|
email_image = email.secondary.url
email_name = email.name
merge(email_name, email_image)
end
end
def merge(email_name, email_image)
manipulate! do |img|
@product = Product.find(model.id)
email_image = ::MiniMagick::Image.open(email_image)
img = email_image.composite(img, "jpg") do |c|
c.gravity "Center"
end
# img = yield(img) if block_given?
img = img.name "#{email_name}_#{@product.product_number}.png"
img
end
end
end
更新しました
最初に、あなたの徹底的な回答に感謝したいと思います。関係する労力の量は明らかであり、高く評価されています。
このソリューションを実装しようとしたときに、さらにいくつかの質問がありました。#compose メソッド内には次のものがあります。
email_image = ::MiniMagick::Image.open(email_image)
これは次のとおりです。
email_image = ::MiniMagick::Image.open(email_image_url)
これは、以下に含まれる define_method 呼び出しを見てからだと思います (ちなみに、これは素晴らしいものでした。それができるとは知りませんでした)。
define_method(:email_image_url) { email.secondary.url }
未定義のメソッド「versions_for」を取得した後、#versions_for メソッドを切り替えました。これは、常にすべてのメールにセカンダリ バージョンが必要であるためです。
versions_for 以前
def self.versions_for emails
reset_versions!
email.find_each { |e| version_for_email(e) }
end
変更後のバージョン
def self.versions_for
reset_versions!
Email.all.find_each { |e| version_for_email(e) }
end
この変更により、エラーを取り除くことができました。
これらすべての最終結果は、すべてが機能しているかのように表示され、エラーなしで画像をアップロードできますが、電子メール バージョンの結果の画像がありません。私はまだ親指などの他のバージョンを取得しています。これを引き起こす原因は何ですか? これまでに提供してくださったすべてのヘルプに改めて感謝します。