我正在尝试使用DelayedJobActiveRecord上传图片。但是当我尝试在DelayedJob中添加它时如下
AmazonService.delay.amazon_s3_store_image(image.last["image"], key)
###image.last["image"]
#<ActionDispatch::Http::UploadedFile:0x00000004c0ff40
@content_type="image/jpeg",
@headers=
"Content-Disposition: form-data; name=\"post[images_attributes][0][image]\"; filename=\"GALAXY_SIII_mini_Product_Image4.jpg\"\r\nContent-Type: image/jpeg\r\n",
@original_filename="GALAXY_SIII_mini_Product_Image4.jpg",
@tempfile=#<File:/tmp/RackMultipart20140524-3636-3bt3se>>
### key
"e6368079c2c6cdb4dbdaf6e5c03f2f"
def amazon_s3_store_image(image, key)
BUCKET.objects[key].write(image, acl: :public_read)
url = BUCKET.objects[key].public_url(secure: false)
url.scheme + "://" + url.host + url.path
end
完全错误消息
NoMethodError: undefined method `name' for nil:NilClass
from /home/awais/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/psych/visitors/yaml_tree.rb:70:in `block in initialize'
我知道如何使用sidekiq,但不幸的是我的内存问题较少,因此我想使用DelayedJob来做这件事。
由于
答案 0 :(得分:0)
在将延迟作业排入队列时,gem必须将执行操作所需的所有数据序列化到数据库中。所以,通常你不想序列化,例如整个对象(例如用户或其他对象),因为用户的所有属性都被序列化到数据库中 - 这是额外的工作,并且可能在作业运行时提供过时的数据!但是,在您的情况下,听起来好像您要求延迟作业尝试将图像文件序列化到数据库中!这听起来像是失败了。 (尝试在调试器中运行image.last["image"].to_yaml
,看看你得到了什么!)
因此,为了让它在延迟作业中工作,您可能需要创建一个custom Delayed Job,它引用先前存储在文件系统上的临时位置的图像或类似的东西。这当然是额外的工作......但我认为没有办法解决这个问题。我不得不做过去将生成的PDF上传到AWS的事情。
注意:当您暂时将图像存储到文件系统时,还有一个令人头疼的问题,那么稍后再运行延迟的作业...图像必须存储在同一文件系统上延迟工作运行的那个或者找不到它!