use*_*535 7 ruby-on-rails background-process ruby-on-rails-3
我正在上传制表符分隔的文档并在控制器中处理.一切正常,但可能需要一些时间在一个大文件上.我想把它移到delay_job,我在我的应用程序的其他地方工作,但由于这是在控制器中,不能以相同的方式调用.
表单调用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
Run Code Online (Sandbox Code Playgroud)
我发现当我必须这样做时,控制器中定义的方法必须是一个类方法.我不记得为什么会这样,我认为这与拥有更明确的接收器有关.所以我要做的是使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
Run Code Online (Sandbox Code Playgroud)
你应该好好去!我也process_file通过AJAX调用我的原始方法(在这种情况下),然后我添加了head :no_content它,以便它返回一些东西而不需要重定向或任何东西.