【发布时间】:2014-10-15 03:48:28
【问题描述】:
我正在尝试为Post(创建记录以及上传和处理)创建关联图像(PostPhoto),并通过 SideKiq 将它们移动到后台进程。以下是模型:
class Post < ActiveRecord::Base
has_many :post_photos
accepts_nested_attributes_for :post_photos, allow_destroy: true
class PostPhoto < ActiveRecord::Base
mount_uploader :photo, PhotoUploader
belongs_to :post
这是我的上传者:
class PhotoUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :fog
include CarrierWave::MimeTypes
process :set_content_type
最初,在帖子保存后,我在我的帖子控制器中运行了这个:
params[:post_photos]['photo'].each do |p|
@post.post_photos.create!(:photo => p, :post_id => @post.id)
end
这很好用。现在我正在尝试这样做:
params[:post_photos]['photo'].each do |p|
PostPhotoWorker.perform_async p, @post.id
end
这是我的 PostPhotoWorker
class PostPhotoWorker
include Sidekiq::Worker
sidekiq_options queue: "high"
sidekiq_options retry: false
def perform(p, post_id)
post = Post.find_by_id(post_id);
post.post_photos.create!(:photo => p, :post_id => post_id)
end
end
作业失败。在我看到的 sidekiq 日志中:
2014-08-21T12:23:09.583Z 24655 TID-ovhl6hlbw 警告:没有将 nil 隐式转换为字符串
我知道post_id 和照片临时文件p 都已正确传递,并且post = Post.find_by_id(post_id); 正在查找该帖子。但似乎在创建操作中有些东西失败了。是否有某些原因导致相关照片记录的创建以及上传和处理在后台进程中失败但作为主要进程的一部分成功? sidekiq 日志中没有堆栈跟踪,所以我无法弄清楚这个问题是在哪里出现的。
知道是什么原因造成的吗?
仅供参考
我不能使用 Carrierwave Backgrounder,因为我在 Heroku 上进行生产,并且 Carrierwave Backgrounder 不支持在 Heroku 上存储图像的背景,因为 Ephemeral File System(这是我想要后台处理的主要原因首先)。我不想使用 Carrierwave Direct,因为它似乎需要为帖子和图像提供单独的表单,而且我还没有准备好重构我的代码来支持它,至少在我找到一种方法之前不会这样做优雅。
我有一种感觉,将整个照片临时文件作为值传递给 redis 是一个坏主意。但是翻阅redis的文档,好像是should support it。
【问题讨论】:
标签: ruby-on-rails heroku carrierwave sidekiq