Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 控制器对延迟作业的操作_Ruby On Rails_Ruby On Rails 3_Background Process - Fatal编程技术网

Ruby on rails 控制器对延迟作业的操作

Ruby on rails 控制器对延迟作业的操作,ruby-on-rails,ruby-on-rails-3,background-process,Ruby On Rails,Ruby On Rails 3,Background Process,我正在上传一个制表符分隔的文档,并在控制器中进行处理。一切正常,但在一个大文件上可能需要一些时间。我想将其移动到delay_作业,我在我的应用程序中的其他位置工作,但由于这是在控制器中,因此不能以相同的方式调用 表单调用process_file操作,而process_file操作又调用salesupload操作。我该如何将此转化为背景工作 class SalesController < ApplicationController def salesupload(file) u

我正在上传一个制表符分隔的文档,并在控制器中进行处理。一切正常,但在一个大文件上可能需要一些时间。我想将其移动到delay_作业,我在我的应用程序中的其他位置工作,但由于这是在控制器中,因此不能以相同的方式调用

表单调用process_file操作,而process_file操作又调用salesupload操作。我该如何将此转化为背景工作

class SalesController < ApplicationController

  def salesupload(file)
    uploaded_io = file.read
    numrows = "uploaded_io.size"
    FasterCSV.parse(uploaded_io, {:headers => true, :col_sep =>"\t"}).each do |row_data|
        full, upc, _discard, isrc = row_data[26].match(/^([^_]+)(_(.+))?/).to_a
          new_record = AppleSale.new(
              'provider' =>  row_data[0],
              'provider_country' => row_data[1],
              'vendor_identifier' => row_data[2]
          )
      new_record.save
    end
  end

    def process_file
        file = params[:apple_sale][:tsv_file]
        salesupload(file)
    end

end
class SalesControllertrue,:col\u sep=>“\t”})。每个都做|行数据|
完整,upc,_discard,isrc=行_数据[26]。将(/^([^]+)((+)?/)匹配到
new_record=AppleSale.new(
“提供程序”=>行数据[0],
“提供商所在国家”=>行数据[1],
“供应商标识”=>行数据[2]
)
new_record.save
结束
结束
def进程文件
file=params[:苹果销售][:tsv\u文件]
销售上传(文件)
结束
结束

当我不得不这样做时,我发现控制器中定义的方法必须是类方法。我不记得为什么会这样,我想这与有一个更明确的接受者有关。因此,我要做的是将salesupload方法设置为类方法,然后对其调用
.delay

def self.salesupload(files)
  # code
end

def process_file
  file = params[:apple_sale][:tsv_file]
  SalesController.delay.salesupload(file)
  head :no_content
end

你应该可以走了!我还通过AJAX调用了我原来的方法(
process\u file
),然后我添加了
头:no\u content
,这样它就返回了一些东西,而不需要重定向或其他任何东西。

我想你应该将此代码移动到一个模型或一个单独的类(例如在lib文件夹中)。但这只是组织和最佳实践的问题

关于在后台运行此代码,您有很多选择。 如果你想使用delayed_job,我想你应该看这个视频:

但基本上,在设置了延迟作业之后,您只需使用类似send_later(:process_file)的命令在后台运行该项目。 这非常简单,您的命令和数据结构将保存在一个数据库表中,稍后一个单独的进程可以执行它。我想在看了《铁轨》之后,你会得到你的答案;)

我写了一个叫做gem的东西来做这个

在这种情况下,你会写

延迟的\u操作[:销售\u上传]

就这样