ruby-on-rails - 延迟作业的 Controller 操作

标签 ruby-on-rails ruby-on-rails-3 background-process

我正在上传一个制表符分隔的文档并在 Controller 中进行处理。一切正常,但在大文件上可能需要一些时间。我想把它移到一个 delay_job,我在我的应用程序的其他地方工作,但因为它在 Controller 中,不能以相同的方式调用。

该表单调用 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

最佳答案

我发现当我不得不这样做时, Controller 中定义的方法必须是类方法。我不记得为什么会这样,我认为这与有一个更明确的接收器有关。所以我要做的就是让 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这样它就可以在不需要重定向或任何东西的情况下返回一些东西。

关于ruby-on-rails - 延迟作业的 Controller 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12956661/

相关文章:

ruby-on-rails - 解析 nokogiri 元素的问题

android - 如何让我的应用程序在后台运行?

swift - Alamofire 背景在模拟器上工作但不在设备上工作

ruby-on-rails - Q.A 的最终集成测试

ruby-on-rails - $redis 全局变量与 ruby​​ on rails

ruby-on-rails - 字符串的未定义方法 `serializable_hash'

ruby-on-rails-3 - Rails 3.1.1 中的静态页面和资源

javascript - 在浏览器中调用 oAuth2 api 时出现 404 错误

ruby-on-rails-3 - Rails3 : Nested form doesn't save because id

ios - 如何安排无需用户干预即可唤醒 iOS 应用程序的警报