使用带挂钩的延迟作业的Carrierwave进度信息

时间:2012-05-20 17:19:53

标签: ruby-on-rails ruby-on-rails-3 delayed-job carrierwave

我正在使用延迟工作来完成一些可能需要一些时间的载波工作。

目前我已经创建了一个简单的工作,成功的钩子,它看起来像这样:

class VideoclipDownloadJob

  def initialize(video_id)
    @video_id = video_id
  end

  def perform
    Videoclip.grab_videoclips(@video_id)
  end

  def success(job)
    Rails.logger.info { "Videoclip downloads for video: #{@video_id} complete" }
    Video.find(@video_id).update_attribute(:videoclips_downloaded, Time.now)
  end

end

它工作正常,我目前在浏览器中实现了一些AJAX轮询,以检查作业何时完成并重定向。

但是,我对这种方法有两个问题,并希望就此得到一些建议。

首先,如果用户当前没有javascript,则在作业完成后无法重定向。

因此,我希望在我的工作成功钩子中加入redirect_to。我尝试将此直接添加到success(job)方法中但没有成功,并且还在我的模型中创建了一个方法来执行此操作。

在那一点上,它让我意识到它似乎不是一个好的MVC模式。

我是否应该完全依赖javascript或者有更好的选择吗?

我的第二个问题与使用Carrierwave有关。

它适用于文件的基本传输,但文件可能非常大,我真的希望能够不仅显示两个状态......下载和完成,还有进度(百分比)实际转移。

在客户端,我可以像处理工作一样轮询这些信息。

但是 - 我在Carrierwave文档中找不到任何提及找出上传者特定进度的方法。

非常感谢任何关于实现这两件事的最佳方法的建议。

谢谢,

克里斯

1 个答案:

答案 0 :(得分:2)

redirect_to是对browser / js请求的响应。当您安排了后台作业并且JS被禁用时,如果用户的浏览器没有发出任何新请求,则无法重定向用户。如果你在他的浏览器提出新请求时重定向他,那可能不是一个好主意,因为你可能会打断他的工作。