Sidekiq异步任务执行失败求助:ArgumentError参数错误
问题分析与解决方案
嘿,这问题我太熟了!咱们先抓错误日志里的核心信息:ArgumentError: When assigning attributes, you must pass a hash as an argument.,再结合你传参的方式,原因一下子就明了:
你在控制器里调用ProcessWorker.perform_async(book_params)时,book_params是Rails特有的ActionController::Parameters对象,不是原生的Ruby哈希。Sidekiq在序列化任务参数时,会把这个特殊对象转成字符串(看日志里的args是个字符串:["{\"name\"=>\"Hello\", ...}"]),等Worker执行perform方法时,拿到的是字符串而非哈希,自然就触发了Book.new的参数错误。
修复步骤
只需要把book_params转换成纯Ruby哈希再传给Sidekiq就行,用to_h方法轻松搞定:
修改控制器代码(books_controller.rb)
def create # 将book_params转为纯哈希后再传递给Sidekiq @job = ProcessWorker.perform_async(book_params.to_h) h = {"response" => {"job_id" => @job}} render json: h end
Worker类的代码完全不用改,现在它收到的会是标准哈希参数,Book.new(book_params)就能正常识别并赋值属性了。
额外小提示
如果你的book_params包含未通过强参数过滤的属性(不过看你的场景应该不存在这种情况),也可以用to_unsafe_h转换,但通常to_h就足够了——毕竟book_params已经是你明确允许的参数集合。
内容的提问来源于stack exchange,提问作者Ramesh
相关产品推荐
相关产品推荐

