Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么赢了';t Carrierwave和MiniMagick图像是否正确合成?_Carrierwave_Rackspace Cloud_Fog_Minimagick - Fatal编程技术网

为什么赢了';t Carrierwave和MiniMagick图像是否正确合成?

为什么赢了';t Carrierwave和MiniMagick图像是否正确合成?,carrierwave,rackspace-cloud,fog,minimagick,Carrierwave,Rackspace Cloud,Fog,Minimagick,我将carrierwave(0.9.0)与fog(1.18.0)、mini_magick(3.6.0)和Rackspace CloudFile一起使用。我想合成图像 我有两种型号:产品和电子邮件。在products uploader中,我试图创建一个循环通过所有电子邮件的过程,并在每个电子邮件的顶部合成产品图像。background\u image。我还想控制此图像的名称,以便: “#{email.name}#{product.product_number}.jpg” 我在下面介绍了我的过程和

我将carrierwave(0.9.0)与fog(1.18.0)、mini_magick(3.6.0)和Rackspace CloudFile一起使用。我想合成图像

我有两种型号:产品和电子邮件。在products uploader中,我试图创建一个循环通过所有电子邮件的过程,并在每个
电子邮件的顶部合成产品图像。background\u image
。我还想控制此图像的名称,以便:

“#{email.name}#{product.product_number}.jpg”
我在下面介绍了我的过程和方法。测试结果显示一个名为“email_123.png”的文件和原始图像被上传到cloudfiles。该名称目前不包括电子邮件的名称和图像不合成,我只是收到原来的回来。我有什么明显的遗漏吗?谢谢

version:email-do
过程:电子邮件
def-email_复合
Email.all.each do | Email|
email\u image=email.secondary.url
email\u name=email.name
合并(电子邮件名称、电子邮件图像)
结束
结束
def合并(电子邮件名称、电子邮件图像)
操纵do | img|
@product=product.find(model.id)
email\u image=::MiniMagick::image.open(email\u image)
img=email_image.composite(img,“jpg”)do|c|
c、 重心
结束
#img=如果给定块,产量(img)?
img=img.name“#{email_name}{@product.product_number}.png”
img
结束
结束
结束
更新 首先我要感谢你的详尽回答,所付出的努力是显而易见的,值得赞赏

在尝试实施此解决方案时,我还有几个问题。 在#compose方法中,您有:

email_image = ::MiniMagick::Image.open(email_image)
这应该是:

email_image = ::MiniMagick::Image.open(email_image_url)
我从下面包含的define_方法调用(顺便说一句,这太棒了,我不知道你能做到这一点)中推断出这一点:

在获得未定义的方法“versions_for”后,我切换了方法的#versions_,因为我总是希望所有电子邮件都有一个辅助版本

以前的版本 更改后的版本 这个改变使我摆脱了这个错误


所有这一切的最终结果是,一切似乎都正常,我可以毫无错误地上传图像,但现在我没有电子邮件版本的结果图像。我仍然有我的其他版本,如拇指等。你知道这是什么原因吗?再次感谢您迄今为止提供的所有帮助。

呼叫
操作同一版本内多次将其块中的更改应用于同一图像;您需要创建多个版本,每个版本对应一封
电子邮件
。这很棘手,因为CarrierWave真的希望您的代码中有一小部分静态定义的版本;它实际上构建了一个新的匿名上传器来处理每个版本

我们可以欺骗它动态地构建版本,但它非常丑陋。此外,我们必须小心不要保留对过时上传器类的引用,否则我们将无休止地累积类,最终耗尽内存

#在ProductUploader中:
#CarrierWave将其版本类存储在两个位置:
#
# 1. 在@versions散列中,存储在类中;和
# 2. 作为上传程序中的常量,名称基于其#object_id。
#
#我们必须清除这两个版本,以确保旧版本得到垃圾
#镇静!
def self.reset_版本!
versions.keys.select{| k | k=~/^email{/}。每个都做| k|
u=版本。删除(k)[:上传程序]
删除常量(“上传程序”{u.object_id}.gsub('-','''.'))
结束
结束
电子邮件的def self.version_name_
“email”{email.name}”。收件人:
结束
#动态生成与合成图像相对应的+版本+
#使用来自+电子邮件+的图像。
电子邮件的def self.version_
版本(版本名称(电子邮件))do
过程:撰写
#在此处使用+define_method+,以便块中的+email+引用
#参数“email”来自外部范围。
定义方法(:email\u image\u url){email.secondary.url}
#使用相同的技巧覆盖此版本的文件名。
定义_方法(:filename){“#{email_name}}{model.product_number}.png}”
#在产品图片上方撰写+电子邮件\图片+。
def组合
操纵do | img|
email\u image=::MiniMagick::image.open(email\u image\u url)
#做实际的作文。
img=email_image.composite(img,“jpg”)do|c|
c、 重心
结束
img
结束
结束
结束
结束
#清除所有先前存在的版本,并基于
#+电子邮件+的内容。
电子邮件的def self.versions\u
重置所有版本!
email.find_each{e|version_for_email(e)}
结束
#在您为(电子邮件)调用Product.versions_之后,您可以使用它获取
#特定电子邮件的版本:
电子邮件的def版本
版本[self.class.version\u name\u for(电子邮件)]
结束
要使用此功能,请确保为(Email.all)调用
Product.versions\u
(可能在筛选之前的
中),然后,您可以使用
@p.Product.version\u为(Email)
访问特定电子邮件的版本:

#在控制器中:
def动作
#为每封电子邮件重新创建+版本+。
#如果您不想覆盖*每个*电子邮件的图像,您还可以传递
#在这里。
ProductUploader.versions\u for(Email.all)
#将文件及其版本上载到云文件。。。
@p=产品.查找(参数[:id])
@p、 product=File.open(Rails.root.join('clouds.jpg'),'r')
@p、 救命!
结束
在视图中,您可以像往常一样使用
url
或任何其他帮助程序:

#在视图中:

感谢您的回复,我在尝试实施您的解决方案时遇到了一些后续问题,我已将这些问题包含在上面的“更新”部分中。要响应您的更新:
email\u image
vs.
email\u image\u url
确实是一个输入错误,您的修复是正确的。我相信你的另一个问题是由我的另一个打字错误引起的——应该是define_method(:email_image_url) { email.secondary.url }
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