【发布时间】:2014-11-07 02:05:54
【问题描述】:
不幸的是,对于那些有类似问题的人来说,赏金奖励给了一个不能解决这个问题的答案。
我有一个带有图片上传的表单(heroku 到 s3)。当我提交表单时,我的 Rails 服务器会等待上传图像的后台作业完成,然后再向用户返回响应。这会导致每次上传图片时应用程序超时。
当前事件顺序:
- 用户提交表单
- 服务器接收表单
- 如果有图片,服务器启动后台作业
- 如果后台作业已启动,服务器会等待它完成(rails 在此处超时)
- 如果启动,后台作业完成
- 服务器处理请求
- 服务器响应用户
所需的事件顺序:
- 用户提交表单
- 服务器接收表单
- 服务器处理非图像字段
- 如果有图片,服务器启动后台作业
- 服务器响应用户
- 后台作业完成,服务器处理上传的图片(保存 URL)
上传代码
class PhotoUploader < CarrierWave::Uploader::Base
include ::CarrierWave::Backgrounder::Delay
include CarrierWave::MimeTypes
process :set_content_type
storage :fog
end
Carrierwave::Backgrounder 初始化器
CarrierWave::Backgrounder.configure do |c|
c.backend :sidekiq, queue: :carrierwave
end
用户模型
class User < ActiveRecord::Base
mount_uploader :photo, PhotoUploader, delayed: true
process_in_background :photo
end
没有控制器代码,因为表单由 ActiveAdmin 处理。我可以在需要的地方覆盖,但无法弄清楚需要改变什么。
要获得正确的事件顺序,我必须进行哪些更改?
【问题讨论】:
-
如果我完全误解了这个问题,请原谅我,但是如果通过标准 HTML 表单提交完成,上传不会是异步的吗?这不需要一些javascript来异步处理上传,像这样吗? github.com/JangoSteve/remotipart
-
我看过的所有关于异步图片上传的教程和资源都没有改变生成的 HTML 表单,只是控制器。正如我提到的图片上传工作正常。处理表单的控制器不需要等待。
-
抱歉,我需要查看更多代码才能了解您是如何尝试实现这一点的。 sidekiq 工作人员是在处理整个上传到 S3 的过程,还是在上传完成后排队处理数据库更新?响应表单提交的控制器是什么样的?
-
这些应该都不重要,因为一切正常。我只需要控制器不等待异步图像上传。 ActiveAdmin 正在使用标准上传器 (carrierwave) 处理表单。除了 ActiveAdmin 之外,此设置绝对没有什么特别之处。
-
所以你的意思是使用非 ActiveAdmin 设置,标准 Rails 控制器(直接或间接)从 ActionController::Base 继承,上传将异步工作,控制器操作不会阻塞,直到上传完成了吗?
标签: ruby-on-rails carrierwave sidekiq