我在Sidekiq工作程序中有以下方法:
def self.schedule_edits(course:, editing_user:, enrollment_results:)
puts editing_user.id
perform_async(course.id, editing_user.id, enrollment_results)
end
我有一个控制器测试,当它调用此代码时,会抛出以下警告:
WARN: Job arguments to MassEnrollmentWorker do not serialize to JSON safely. This will raise an error...
我已经读到了这里的警告,我猜registration_results是一个冒犯性的论点。然而,当我运行测试并输出enrollment_results时,我看到的是:
{"FirstUser"=>{:success=>"User added to course."}, "SecondUser"=>{:success=>"User added to course."}, "NotARealUserOnWikipedia"=>{:failure=>"Not an existing user."}
这似乎是一个有效的散列,那么问题出在哪里呢?
注意关于符号的部分。
https://github.com/mperham/sidekiq/wiki/Best-Practices#1-使你的工作参数小而简单的
传递给perform_async的参数必须由简单的JSON数据类型组成:字符串、整数、浮点、布尔、null(nil(、数组和哈希。这意味着您不能将ruby符号用作参数。
在我的案例中,我只需要将哈希映射的格式更改为字符串rocket=>风格
发件人:
Sidekiq::Client.push('class' => 'RecordOrderJob', 'args' => { foo: 'bar' })
至:
Sidekiq::Client.push('class' => 'RecordOrderJob', 'args' => { 'foo' => 'bar' })
只需避免散列中的符号。
为子孙后代;我通过改变哈希的构建方式来解决这个问题:
{"FirstUser"=>{:success=>"User added to course."}, "SecondUser"=>{:success=>"User added to course."}, "NotARealUserOnWikipedia"=>{:failure=>"Not an existing user."}
到。。。
{"FirstUser"=>{"success"=>"User added to course."}, "SecondUser"=>{"success"=>"User added to course."}, "NotARealUserOnWikipedia"=>{"failure"=>"Not an existing user."}