我正在使用带有雾 (1.18.0)、mini_magick (3.6.0) 和 Rackspace CloudFiles 的carrierwave (0.9.0)。我想合成图像。
我有两个模型:产品和电子邮件。在产品上传器中,我试图创建一个循环遍历所有电子邮件并将产品图像合成到每个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 方法,因为我总是希望所有电子邮件都有一个辅助版本。
以前的版本
def self.versions_for emails
reset_versions!
email.find_each { |e| version_for_email(e) }
end
更改后的versions_for
def self.versions_for
reset_versions!
Email.all.find_each { |e| version_for_email(e) }
end
此更改使我摆脱了错误。
所有这一切的最终结果是一切看起来都好像可以正常工作,我可以毫无错误地上传图像,但现在我没有电子邮件版本的结果图像。我仍然得到我的其他版本,如拇指等。知道可能导致这种情况的原因吗?再次感谢您迄今为止提供的所有帮助。