Rails Youtube_it宝石背景工作

时间:2014-05-12 16:41:56

标签: ruby-on-rails ruby youtube-api delayed-job

我对Rails相当新,我有一个Ruby on Rails 3.2应用程序,并且我已经集成了这里看到的Youtube_it gem https://github.com/kylejginavan/youtube_it。宝石工作正常,我可以将视频上传到youtube,但处理视频需要一段时间。我希望能够将其作为后台作业运行,并将用户重定向到我创建的感谢页面。

我不知道在哪里调用延迟方法。我想调用delay方法,然后让用户重定向到page_path(' thank-you')页面。

非常感谢任何帮助。我已经搜遍了所有的答案。

VideosController     def上传     @video = Video.create(params [:video])

if @video
  @upload_info = Video.delay.token_form(params[:video], save_video_new_video_url(video_id:     @video.id))
else
  respond_to do |format|
    format.html { render "/videos/new" }
  end
end
end



def save_video
@video = Video.find(params[:video_id])

if params[:status].to_i == 200
  @video.update_attributes(youtube_id: params[:id].to_s, is_complete: true, user_id: current_user.id, approved: false)
  Video.delete_incomplete_videos
else
  Video.delete_video(@video)
end
#redirect_to videos_path, notice: "video successfully uploaded"
redirect_to page_path('thank-you')
end

这是我的控制器。

class VideosController < ApplicationController
before_filter :authenticate_user!, only: [:new, :upload, :save_video, :destroy]

def index
  if params[:category]
    Video.yt_session
    @videos = Video.approved.where(category_id: params[:category])
  else
    Video.yt_session
    @videos = Video.approved
  end

respond_to do |format|
  format.html # index.html.erb
  format.json { render json: @videos }
end
end

def show
 @video = Video.find(params[:id])

 respond_to do |format|
  format.html # show.html.erb
  format.json { render json: @video }
 end
end

def new
@video =Video.new
@categories = Category.all

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @video }
end
end


def upload
@video = Video.create(params[:video])

if @video
  @upload_info = Video.token_form(params[:video], save_video_new_video_url(video_id: @video.id))
else
  respond_to do |format|
    format.html { render "/videos/new" }
  end
end
end




def save_video
@video = Video.find(params[:video_id])

respond_to do |format|
  if @video.update_attributes(:youtube_id => params[:id].to_s, :is_complete =>     true,:user_id=>current_user.id,:approved=>false)
    format.html { redirect_to page_path('thank-you') }
    format.json { head :no_content }
  else
    format.html { Video.delete_video(@video) }
    format.json { render json: @category.errors, status: :unprocessable_entity }
  end
end
end


def destroy
@video = Video.find(params[:id])

if Video.delete_video(@video)
  flash[:notice] = "Video deleted."
else
  flash[:error] = "We were unable to delete this video."
end
redirect_to videos_path
end


def vote_up
@video = Video.find(params[:id])
@video.update_attribute(:votes_up, (@video.votes_up.to_i + 1))
redirect_to @video
end


protected
def collection
@videos ||= end_of_association_chain.completes
end
end

1 个答案:

答案 0 :(得分:0)

你总是可以使用后台工作人员使用delayed_job之类的东西来做这件事,但我个人说我更喜欢使用Resque / beanstalkd / RabbitMQ,因为我可以同时运行多个worker。

为了让您的生活更轻松,您只需尝试Sidekiq(https://github.com/mperham/sidekiq)。

您将把工人逻辑移动到某个工作人员。

将Sidekiq包含在您的Gemfile中

gem 'sidekiq'

在你的控制器上添加如下内容:

VideoSaverWorker.perform_async(@video.id)

VideoSaverWorker必须类似于:

class VideoSaverWorker
  include Sidekiq::Worker
  sidekiq_options queue: "high"

  def perform(video_id)
    video = Video.find(video_id)
    .....
    .....
  end
end

请注意使用此功能,您将在后台线程中完成工作,但不会将您重定向到相关页面。

您需要做一些解决方法,例如定期重新填充页面,直到您在查看html页面上看到更改,或者您可以使用Faye或Node.js将更改推送到您的网页。