1

我正在为一些可能需要一些时间的载波任务使用延迟工作。

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

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 文档中找不到任何提及找出上传者具体进度的方法。

任何有关实现这两件事的最佳方法的建议将不胜感激。

谢谢,

克里斯

4

1 回答 1

2

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

于 2012-05-21T05:12:39.217 回答