0

我有一个 rails 3 应用程序,今天我决定在创建操作中将 resque 添加到我的控制器中的 message_image 上传器

def create
@recipient = User.find(params[:message][:recipient_id])
@message = current_user.send_message(@recipient, params[:message][:body])
#@message.images << MessageImage.create!(params[:message][:images_attributes])
respond_with(@message) do |format|
  if @message.save!
    Resque.enqueue(AddImageToMessage, @message.id, params[:message][:images_attributes])
    format.js do
      unless request.referer.include? 'messages'
        render :text => "window.location = '#{messages_path}'", notice: 'message has been succ created.'
      end
    end
  else
    redirect_to :back
  end
end

结束,我有课

class AddImageToMessage
 @queue = :messages_queue
 def self.perform(message_id, images_params)
   message = Message.find(message_id)
   message.images << MessageImage.create!(images_params)
   message.save
 end
end

但是,如果我尝试创建新消息并附加图像,redis 日志服务器中会出现错误 https://gist.github.com/Olefine/6270753。在此日志中,我的记录无效,但我所有的验证都通过了如果我在控制器中使用标准方法

@message.images << MessageImage.create!(params[:message][:images_attributes])
4

1 回答 1

1

我猜这是因为 resque/redis 如何在内部工作,通过序列化将数据转储到 redis

json格式化_

所以它在内部做了一些事情

 object.to_json  ## before pushing to redis
 JSON.parse object  ## after popping from redis

您的问题与yamljson建议序列化复杂对象不同

但是在您的情况下,您的 image_attributes 包含一个包含文件对象的复杂哈希,并且 AFAIK 没有 json 库可以序列化/反序列化文件,这在您的日志中也很明显

"tempfile"=>["�PNG\r\n", "\u001A\n", "\u0000\u0000\u0000\rIHDR\u0000\u0000\u0000�\u0000\u0000\u0000�\b\u0006\u0000\u0000\u0000�X��\u0000\u0000\u0000\u0006bKGD\u0000�\u0000�\u0000�����\u0000\u0000\u0000\atIME\a�\u0004\u0019\u000F\u0016!7\u0011\u001A-\u0000\u0000 \u0000IDATx���wt\u0014�����m��$��{�]D@\u0001�M�t\u0011\u0005EA�l(XP\u0004\u0015\u0010Q�H���S� �t�\"��P\u0013\b\u0010 !��-3�\u001FK����4\u0012���\u001C�w��\\6������\u001F��\u001Fv\u0011\n", "{\u0000�\u0018\u0001@\t \b�X\u001DK\u0000\u0012��\a?��\u001D�\u007F\u0014\u0004�\t�2��\u0016@#�\u0001P\u001D(\u000F�\\<�\u0000D\u0000 ..."

您可以看到该对象serializationdeserialization除了您之外,它不是您的对象,它应该是一个文件,而不是显示二进制数据输出的字符串

我建议你宁愿改变你的架构,也许重新考虑你打算如何做到这一点

建议

也许您可以对表单multipart选项进行建模,然后使用carrierwave_backgrounder或类似的东西(如果您不打算使用carrierwave)并通过这些库在后台卸载上传部分

希望这有帮助

于 2013-08-21T10:10:16.430 回答