You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:36:02