簡體   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