[英]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.