Ruby on rails Rails Youtube\u it gem后台作业

Ruby on rails Rails Youtube\u it gem后台作业,ruby-on-rails,ruby,youtube-api,delayed-job,Ruby On Rails,Ruby,Youtube Api,Delayed Job,我是Rails的新手,我有一个RubyonRails3.2应用程序,我集成了这里看到的Youtube_it gem。gem运行良好,我可以将视频上传到youtube,但处理视频需要一段时间。我希望能够运行作为一个后台作业,并重定向到我创建的感谢页面的用户 我不确定在哪里调用延迟方法。我想调用delay方法,然后让用户重定向到page_path(“谢谢”)页面 任何帮助都将不胜感激。我到处寻找答案 视频控制器 def上传 @video=video.create(参数[:video]) 这是我的控制

我是Rails的新手,我有一个RubyonRails3.2应用程序,我集成了这里看到的Youtube_it gem。gem运行良好,我可以将视频上传到youtube,但处理视频需要一段时间。我希望能够运行作为一个后台作业,并重定向到我创建的感谢页面的用户

我不确定在哪里调用延迟方法。我想调用delay方法,然后让用户重定向到page_path(“谢谢”)页面

任何帮助都将不胜感激。我到处寻找答案

视频控制器 def上传 @video=video.create(参数[:video])

这是我的控制器

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
class videoscocontrollerparams[:id]。to_s,:is_complete=>true,:user_id=>current_user.id,:approved=>false)
format.html{重定向到页面路径('thank-you')}
format.json{head:no_content}
其他的
format.html{Video.delete_Video(@Video)}
format.json{render json:@category.errors,status::unprocessable_entity}
终止
终止
终止
def销毁
@video=video.find(参数[:id])
if Video.delete_Video(@Video)
flash[:注意]=“视频已删除。”
其他的
flash[:error]=“我们无法删除此视频。”
终止
重定向到视频路径
终止
投票表决
@video=video.find(参数[:id])
@video.update_属性(:vows_up,(@video.vows_up.to_i+1))
将_重定向到@video
终止
受保护的
def收集
@视频| |=关联链的结束
终止
终止

您始终可以使用后台工作程序来完成这项工作,比如使用,但就个人而言,我更喜欢使用Resque/beanstalkd/RabbitMQ,因为我可以同时运行多个工作程序

为了让你的生活更轻松,你只需尝试Sidekiq()

您将把工作程序逻辑移动到某个工作程序

将Sidekiq包含到您的GEM文件中

gem 'sidekiq'
在控制器上添加如下内容:

VideoSaverWorker.perform_async(@video.id)
class VideoSaverWorker
  include Sidekiq::Worker
  sidekiq_options queue: "high"

  def perform(video_id)
    video = Video.find(video_id)
    .....
    .....
  end
end
VideoSaverWorker的外观必须类似于:

VideoSaverWorker.perform_async(@video.id)
class VideoSaverWorker
  include Sidekiq::Worker
  sidekiq_options queue: "high"

  def perform(video_id)
    video = Video.find(video_id)
    .....
    .....
  end
end
请注意,使用此功能,您将在后台线程中完成工作,但它不会将您重定向到相关页面


你需要做一些变通办法,比如定期重新刷新页面,直到你在查看html页面上看到更改,或者你可以使用Faye或Node.js将更改推送到你的网页上

我已经尝试过整合延迟的就业市场。我只是不确定在哪里调用.delay方法来延迟上传并重定向到感谢页面。我用控制器编辑了我的问题。