繁体   English   中英

我们如何通过 rails 中的 controller 操作将任何参数 [:file] 传递给 Sidekiq Worker

[英]How can we pass any params[:file] to Sidekiq Worker through controller action in rails

这是我的 Controller

class CsvController < ApplicationController
  def read_csv
    CsvWorker.perform_async(params[:file])
  end

end

这是我的工人

class CsvWorker
  include Sidekiq::Worker

  def perform(file)
    csv_file = SmarterCSV.process(file)
  end
end

我没有在 CsvWorker 中得到完整的文件CsvWorker ,我只得到这个file object 作为字符串

"#<ActionDispatch::Http::UploadedFile:0x00007fa6b87ea0c0>"

我想在CsvWorker中访问这个文件,这样我就可以在后台读取和管理 CSV 文件。

ActionDispatch::Http::UploadedFile是一个 stream,所以它只能在请求期间读取。

另一件事是, sidekiq 建议您将简单类型和小数据发布到消息作业中。 所以我建议您将文件保存到存储中,例如ActiveStorage ,然后将该资源的 ID 或保存文件的路径发布到 sidekiq worker,例如:

class CsvFile < ApplicationModel
    has_one_attached :file
end

class CsvController < ApplicationController
  def read_csv
    csv = CsvFile.create(params)
    CsvWorker.perform_async(csv.id)
  end
end

class CsvWorker
  include Sidekiq::Worker

  def perform(csv_file_id)
    csv = CsvFile.find(csv_file_id)
    csv_file = SmarterCSV.process(csv.file.read)
  end
end

使用这种方法,您可以通过添加一个状态列告诉最终用户,即已received ,然后是processing ,已processederror ,为最终用户提供良好的反馈

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM