[英]How to get params from controller into Sidekiq worker (rails)
[英]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
,已processed
和error
,為最終用戶提供良好的反饋
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.