控制器行动延迟工作



我正在在控制器中上传一个删除的文档和处理。一切正常,但是在大文件上可能需要一些时间。我想将其移至我应用程序其他地方工作的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

我在必须这样做时发现控制器中定义的方法必须是类方法。我不记得这是为什么,我认为这与拥有更明确的接收器有关。因此,我要做的就是将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_file),然后我附加了head :no_content,以便它返回某些东西而无需重定向或任何内容。

我写了一个名为delayed_action的宝石。

在这种情况下,您会写 delayed_action [:sales_upload]

就是这样。

我想您应该将此代码移至模型或分开的类(例如在LIB文件夹中)。但这只是组织和最佳实践的问题。

关于在后台运行此代码,您有很多选择。如果您想使用delayed_job,我想您应该观看此屏幕截图: http://railscasts.com/episodes/171-delayed-job

但基本上,设置延迟作业后,您只使用send_later(:process_file)之类的东西来告诉在后台运行该项目。它非常简单,您的命令和数据结构将保存在数据库表中,然后分离的过程可以执行它。我想在观看铁轨之后,您将得到答案;)

最新更新